Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > найти товары с разными значениями


Автор: vladimir74 24.7.2009, 11:41
есть запрос
Код

select ad.posid,  ad.bereit 
from ad
left join pa on (ad.posid=pa.id)
left join a on (pa.auftragsid=a.id)
where a.erstellt = 'F'

posid - id товара
bereit - 'T'/'F'
надо еще выявить те товары которые имеют в bereit - 'T' и 'F'

Автор: azesmcar 24.7.2009, 11:53
Не совсем понятно о чем речь, поподробнее...если я правильно понимаю, то что мешает сделать тал?
Код

select ad.posid,  ad.bereit 
from ad
left join pa on (ad.posid=pa.id)
left join a on (pa.auftragsid=a.id)
where a.erstellt = 'F' and ad.bereit = 'T' and ad.bereit = 'F'

?

Автор: vladimir74 24.7.2009, 12:08
не не совсем то, мне надо узнать какие из posid (они могут несколько раз повторятся) имеют только 'T' другие только 'F' 'T' и 'F'

хотя я тут подумал...
таблица а
id          1, 2, 3
erstellt {только для F}
bereit 

таблица pа
id       1, 2, 3, 4, 5, 6
a_id   1, 1, 2, 2, 2, 3
bereit

таблица аd
id                   1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
posid (pa_id)  1, 2, 2, 3, 4, 4, 5, 5, 5, 6
bereit              T  T  T  F   T  F  F  T   T  F

теперь мне надо в таблице pa.bereit поставить T для всех pa.id если в таблице ad.posid все pa.bereit = T иначе F
потом тоже самое c а.bereit

Добавлено через 2 минуты и 59 секунд
т.е в конкретном примере pa получит значения
id       1, 2, 3, 4, 5, 6
a_id   1, 1, 2, 2, 2, 3
bereit T  T  F  F  T  F

потом таблица а
id          1, 2, 3
bereit   T   F  F

Добавлено через 5 минут и 3 секунды
просто я пока не представляю как это можно решить одним update  поэтому решил разделить на запрос и отдельно редактирование...
если есть возможность все сделать одним update   было бы великолепно...

Автор: vladimir74 24.7.2009, 12:29
черт!!! это для Firebird
АДМИНЫ я ошибся темой!!!
перенесите плз в InterBase, Firebird

Автор: Zloxa 24.7.2009, 12:34
Цитата(vladimir74 @  24.7.2009,  12:08 Найти цитируемый пост)
надо узнать какие из posid (они могут несколько раз повторятся) имеют только 'T' другие только 'F' 'T' и 'F'

Код

select ad.posid
          ,case when count(distinct ad.bereit) = 1  then max(ad.bereit)
                when count(distinct ad.bereit) = 2  then 'T&F'
           end bereits
from ad
left join pa on (ad.posid=pa.id)
left join a on (pa.auftragsid=a.id)
group by ad.posid
having count(distinct ad.bereit) = 1 and max(ad.bereit) = 'T'
      or count(distinct ad.bereit) = 2 and max(ad.bereit) = 'T' and min(ad.berit) = 'F'
      or count(distinct ad.bereit) = 1 and max(ad.bereit) = 'F'

Автор: azesmcar 24.7.2009, 12:34
[cut]

Автор: Zloxa 24.7.2009, 12:36
Цитата(vladimir74 @  24.7.2009,  12:29 Найти цитируемый пост)
перенесите плз в InterBase, Firebird 

Перенесем, когда поймем, что для реализации требуется использовать специфику именно этих платформ smile

Автор: vladimir74 24.7.2009, 12:40
Цитата(Zloxa @  24.7.2009,  10:36 Найти цитируемый пост)

Перенесем, когда поймем, что для реализации требуется использовать специфику именно этих платформ smile 

даже не знаю  smile 
но твой запрос не работает вылетает на 5 строке
Код

or count(distinct ad.bereit) = 2 and max(ad.bereit) = 'T' and min(ad.berit) = 'F'

Автор: Zloxa 24.7.2009, 12:48
Цитата(vladimir74 @  24.7.2009,  12:40 Найти цитируемый пост)
не работает

Очень информативно.
Может в FB кавычки по другому надо ставить?

http://www.segfault.kiev.ua/smart-questions-ru.html#beprecise

Автор: vladimir74 24.7.2009, 12:52
Zloxa
спасибо!!! так получилось!
правда надо будет посмотреть как такой монстр будет работать с большим колличеством данных....
но это уже другой разговор.
Кстати а сразу update реально сделать в таком варианте или нет?

Добавлено через 12 минут и 55 секунд
Цитата(Zloxa @  24.7.2009,  10:48 Найти цитируемый пост)
Очень информативно.
Может в FB кавычки по другому надо ставить?

я сначала пробовал с твоим первым запросом, он выдал invalid token если честно я там сам не понял к чему относился or
второй вариант работает.... и анализ запроса показывает что все великолепно...
к сожалению нет подходящей базы с большим колличеством данных (у тех для кого я это делаю менее тысячи записей :( )
но в принципе эт не критично ....
в любом случае еще раз спасибо !!!

Автор: Zloxa 24.7.2009, 13:18
Цитата(vladimir74 @  24.7.2009,  12:52 Найти цитируемый пост)
Кстати а сразу update реально сделать в таком варианте или нет?


Цитата(vladimir74 @  24.7.2009,  12:08 Найти цитируемый пост)
теперь мне надо в таблице pa.bereit поставить T для всех pa.id если в таблице ad.posid все pa.bereit = T иначе F
потом тоже самое c а.bereit

елси я правильно понял, в чем я не уверен.
Код

update pa
  set berit = (select case when count(distinct berit) = 1 and max(berid) = 'T' then 'T' else 'F' end 
                 from ad where ad.pa_id = pa.id);

update a
  set berit = (select case when count(distinct berit) = 1 and max(berid) = 'T' then 'T' else 'F' end 
                 from pa where a.id = pa.a_id);


Автор: vladimir74 24.7.2009, 13:48
Цитата(Zloxa @  24.7.2009,  11:18 Найти цитируемый пост)
елси я правильно понял, в чем я не уверен.

мой поклон, огромное спасибо...

Автор: vladimir74 24.7.2009, 14:38
немного изменил, чтоб считалось только для тех значений где a.erstellt = 'F' 
но это мелочи, благодоря тебе остаток задачи решил за два часа, теперь можно спокойно готовится в выходным!!!!
вобщем вопрос решен!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)