едно проблемно ( за мен ) select-че...

9 отговора 0 прегледа
#1

едно проблемно ( за мен ) select-че...

Тъкмо си мислех, че съм се оправил с тези select-и и пак дърво
Та проблема ми е следния: две таблици, едната с номенклатурата, другата с наличностите, например следните:

таблица nomenklatura

nomer name
--------------------
1001 круши
1002 ябълки
1003 банани


таблица nal

nomer col sklad
-----------------------
1001 10 1
1001 2 2
1002 5 1

Естествено таблиците са примерни

направих си селект, който ми връща наличностите във складовете и всичко е ок, по памет ще го напиша:

select nomenklatura.*, nal.sklad, nal.col from nomenklatura join nal on nomenklatura.nomer = nal.nomer

нещо такова по памет, обаче как да го накарам да ми върне и бананите???,
т.е. да има в резултата и бананите, трябва ми такъв резултат:


nomer name col sklad
----------------------------------
10001 круши 10 1
10001 круши 2 2
10002 ябълки 5 1
10002 ябълки 0 2
10003 банани 0 1
10003 банани 0 2

сигурно ще си реша проблема, ако таблицата nal има следния вид:

nomer col sklad
-----------------------
1001 10 1
1001 2 2
1002 5 1
1002 0 2
1003 0 1
1003 0 2

обаче.... за 60000+ изделия х 4 склада ми се струва доста тъпо да запълвам таблицата с нули, мислех си когато количеството в някой склад стане 0
да изтрия реда.... та има ли начин да се напише select, който да ми върне желания резултат?

Дано съм успял добре да обясня какво искам

Отговор
в отговор на st3O #2

Re: едно проблемно ( за мен ) select-че...

Надявам се това не е production система. В смисъл, няма да те съдят като не работи...

Имаш ли таблица със складовете? Значи взимаш nomenklatura и CROSS JOIN със складовете. Резултата го OUTER JOIN-ваш с наличностите.

Обаче, имай предвид, че складовите програми не работят така. Въобще няма таблица с наличностите. Пазят се само промените (транзакциите) на количествата.

cheers,
</wqw>
p.s. А SQL ли викаш? Ми дай PRIMARY KEYs на тия таблици, типове данни и други "подробности". Best guess в момента е нещо като

SELECT nom.nomer

, COALESCE(nal.col, 0) AS col
, sto.nomer AS sklad
FROM nomenklatura nom
CROSS JOIN stores sto
LEFT JOIN nal
ON nom.nomer = nal.nomer
AND sto.nomer = nal.sklad



[линк]
Отговор
в отговор на st3O #3

За чий му е

на попа тромпет а на теб join?
Пробвай:
сelect nomenklatura.*, nal.sklad, nal.col from nomenklatura where nomenklatura.nomer = nal.nomer

Bеer? Mоre?
Плацебото
Отговор
в отговор на st3O #4

Re: едно проблемно ( за мен ) select-че...

Аз не разбрах за таблицата наличност, при промяна на количеството, правиш update ли? или insert
Т.е е колоната col имаш текущото количество от продукта в дадения момент, в дадения склад. Т.е. ако сега бананите са 0, следобед може да са 100. Правиш update.

Ако триеш ред. Когато бананите станат след обяд 100, дефакто insert в nal.

Сега, едно е да триеш ред в таблицата, когато количеството е 0, друго е да напишеш select...
Ето, ти един select
select nom.nomer code ,nom.descr descr, nal.col qty, nal.sklad store
from nomenklatura nom, nal
where nom.nomer=nal.nomer
and nvl(nal.col,0)<>0
order by nom.nomer, nal.sklad

Редактирано от AйeзCeдaй на

Отговор
в отговор на wqw #5

Re: едно проблемно ( за мен ) select-че...

хм... защо да не работи когато има таблица с наличностите? Всеки път да смята прихода и разхода и така да получава наличноста към момента ли? Дали ще работи бързо, таблицата с разходите е над 600000 реда? Прехвърлям база данни от clipper, затова съм доста ограничен със преструктуриране на таблиците. А относно предложения селект - не работи при мен
ползвам InterBase 6.5 и май не поддържа COALESCE : "The fact that InterBase has no built in ISNULL or CASE or COALESCE functions"....
Други идеи?

Отговор
в отговор на AйeзCeдaй #6

Re: едно проблемно ( за мен ) select-че...

При промяна на количеството в някой склад мисля да правя update, ако има някаква наличност или insert ако няма, така ще е по-малка таблицата с наличностите, защото от около 65000 номенклатурни номера обичайно наличности има само в около 10000.

Отговор
в отговор на st3O #7

Re: едно проблемно ( за мен ) select-че...

Не ми се обяснява защо, но повярвай, такава таблица рядко е коректна, колкото и добре да я maintain-ваш. Обикновено е single source of pain за потребителите, защото наличността често ще е различна от салдата по оборотна ведомост на склада. Съответно ще останат с впечатлението че s/w е много калпав, след като една наличност не може да сметне.

Иначе пробвай без COALESCE (направо nal.col) -- ще ти върне NULL-ове вместо нули.

cheers,
</wqw>


[линк]
Отговор
в отговор на wqw #8

Re: едно проблемно ( за мен ) select-че...

ок, сега ще пробвам, а междувременно написах това:

select nomenklatura.*, nal.sklad, nal.col from nomenklatura FULL join nal on nomenklatura.nomer = nal.nomer

на пръв поглед ми връща каквото ми трябва, ОБАЧЕ :
в реалната база като пусна select с join - "минава" за няколко ms, и четения от двете таблици от порядъка на 300-500, а същия select с FULL join .... ужас, минута и нещо и съответно чете от таблиците над 5млн. и 7 млн. това пък защо ????

Отговор
в отговор на wqw #9

Re: едно проблемно ( за мен ) select-че...

А идеята да се смятат наличностите ми харесва.... наистина отпадат доста проблеми, които сега имам. Програмата, която работи в момента е на над 10 год., писана е на clipper и често се случва несъответствие между наличностите и приход/разход, но то е заради принципа на работа на софтуера - когато някой потребител започне да набира фактура количествата се "вадят" от склада и това гарантира, че някой друг няма да ги фактурира междувременно, а ако се откаже от фактурата - програмата ги "връща" в склада, само че ако напр. спре тока междувременно - няма кой да ги върне... тогава правя точно това - една програмка изчислява приход/разход за всяко изделие и оправя таблицата с наличностите.

Отговор
в отговор на st3O #10

Re: едно проблемно ( за мен ) select-че...

добре де направи една междинна таблица
и когато започва да фактурира, праскаш там всичко (ид фактура, ид ред фактура, количество, артикул, скалд)
щом се фиактурира - триеш реда,
щом, се откаже - от там връщаш всичко обратно- пак триеш реда
щом спре тока - сравняваш ид въведени фактури и това в междинната таблица - триеш или връщаш обратно в наличност...

Отговор