|
Тема
|
едно проблемно ( за мен ) select-че...
|
|
Автор |
st3O (непознат
) |
Публикувано | 03.10.07 16:05 |
|
Тъкмо си мислех, че съм се оправил с тези 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, който да ми върне желания резултат?
Дано съм успял добре да обясня какво искам
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: st3O]
|
|
Автор |
wqw (АзСъмЖив) |
Публикувано | 03.10.07 19:15 |
|
Надявам се това не е 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
| |
|
на попа тромпет а на теб join?
Пробвай:
сelect nomenklatura.*, nal.sklad, nal.col from nomenklatura where nomenklatura.nomer = nal.nomer
Bеer? Mоre?
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: st3O]
|
|
Автор |
AйeзCeдaй ((бойна)) |
Публикувано | 04.10.07 09:42 |
|
Аз не разбрах за таблицата наличност, при промяна на количеството, правиш 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й на 04.10.07 09:57.
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: wqw]
|
|
Автор |
st3O (непознат
) |
Публикувано | 04.10.07 09:59 |
|
хм... защо да не работи когато има таблица с наличностите? Всеки път да смята прихода и разхода и така да получава наличноста към момента ли? Дали ще работи бързо, таблицата с разходите е над 600000 реда? Прехвърлям база данни от clipper, затова съм доста ограничен със преструктуриране на таблиците. А относно предложения селект - не работи при мен
ползвам InterBase 6.5 и май не поддържа COALESCE : "The fact that InterBase has no built in ISNULL or CASE or COALESCE functions"....
Други идеи?
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: AйeзCeдaй]
|
|
Автор |
st3O (непознат
) |
Публикувано | 04.10.07 10:37 |
|
При промяна на количеството в някой склад мисля да правя update, ако има някаква наличност или insert ако няма, така ще е по-малка таблицата с наличностите, защото от около 65000 номенклатурни номера обичайно наличности има само в около 10000.
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: st3O]
|
|
Автор |
wqw (АзСъмЖив) |
Публикувано | 04.10.07 11:27 |
|
Не ми се обяснява защо, но повярвай, такава таблица рядко е коректна, колкото и добре да я maintain-ваш. Обикновено е single source of pain за потребителите, защото наличността често ще е различна от салдата по оборотна ведомост на склада. Съответно ще останат с впечатлението че s/w е много калпав, след като една наличност не може да сметне.
Иначе пробвай без COALESCE (направо nal.col) -- ще ти върне NULL-ове вместо нули.
cheers,
</wqw>
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: wqw]
|
|
Автор |
st3O (непознат
) |
Публикувано | 04.10.07 15:24 |
|
ок, сега ще пробвам, а междувременно написах това:
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 млн. това пък защо ????
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: wqw]
|
|
Автор |
st3O (непознат
) |
Публикувано | 04.10.07 15:57 |
|
А идеята да се смятат наличностите ми харесва.... наистина отпадат доста проблеми, които сега имам. Програмата, която работи в момента е на над 10 год., писана е на clipper и често се случва несъответствие между наличностите и приход/разход, но то е заради принципа на работа на софтуера - когато някой потребител започне да набира фактура количествата се "вадят" от склада и това гарантира, че някой друг няма да ги фактурира междувременно, а ако се откаже от фактурата - програмата ги "връща" в склада, само че ако напр. спре тока междувременно - няма кой да ги върне... тогава правя точно това - една програмка изчислява приход/разход за всяко изделие и оправя таблицата с наличностите.
| |
Тема
|
Re: едно проблемно ( за мен ) select-че...
[re: st3O]
|
|
Автор |
AйeзCeдaй ((бойна)) |
Публикувано | 04.10.07 17:36 |
|
добре де направи една междинна таблица
и когато започва да фактурира, праскаш там всичко (ид фактура, ид ред фактура, количество, артикул, скалд)
щом се фиактурира - триеш реда,
щом, се откаже - от там връщаш всичко обратно- пак триеш реда
щом спре тока - сравняваш ид въведени фактури и това в междинната таблица - триеш или връщаш обратно в наличност...
| |
|
|
|
|