Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка с группировкой / 24 сообщений из 24, страница 1 из 1
15.04.2020, 18:20
    #39947650
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
У меня есть две таблицы:
  • master (id, f1)
  • detail (id, master_id, f2)
мне нужно сделать выборку записей из master и присоединить к каждой записи поле f2, котороя будет заполняться по принципу
  • если для данного мастера у всех деталей поле f2 имеет одинаковое значение, то вернуть это значение
  • если значения разные, то вернуть '-1'

Пример
master
id f11 12 2
detail
id mater_id f21 1 12 1 13 2 13 2 2
выборка всех записей
id f1 f21 1 12 2 -1
условие f2=1
id f1 f21 1 12 2 -1
условие f2=2
id f1 f22 2 -1(здесь первый мастер отфильтровался, а во втором, несмотря на то, мы отфильтровали одну деталь, все равно выводим f2 = -1)

Как бы это красивее сделать? Допускается использование процедур, функций...

P.S. на записи мастера тоже могут накладываться ограничения

С уважением, Vasilisk
...
Рейтинг: 0 / 0
15.04.2020, 18:31
    #39947667
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Чего это ты начал лабораторные делать?..

_Vasilisk_если для данного мастера у всех деталей поле f2 имеет одинаковое значение, то вернуть это
значение

Код: sql
1.
case when count(distinct f2) = 1 then max(f2) else -1 end



_Vasilisk_на выборку может налагаться ограничения на значения поля f2. И если ни
одна деталь не имеет такого значения, то и сам мастер не выводится.
Код: sql
1.
master join detail on ..... and f2 = :значение



_Vasilisk_на записи мастера тоже могут накладываться ограничения

Код: sql
1.
where master.xxx любое условие


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.04.2020, 18:52
    #39947687
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Dimitry Sibiryakov
Код: sql
1.
master join detail on ..... and f2 = :значение

Отфильтровали деталь
Dimitry Sibiryakov
Код: sql
1.
case when count(distinct f2) = 1 then max(f2) else -1 end

ищем различия в уже отфильтрованной детали. А нужно искать отличия по всем.

Два раза делать join? Один фильтрованный, второй нет? Деталей всего 5 штук. В каждой до 4 таких агрегируемых полей
...
Рейтинг: 0 / 0
15.04.2020, 19:02
    #39947695
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
_Vasilisk_А нужно искать отличия по всем.

Тогда условие в having вместо join. Или derived table.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.04.2020, 19:24
    #39947712
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Dimitry Sibiryakov,

и опять таки join мне размножит записи в мастере. Добавлять GROUP BY по всем полям мастера?
...
Рейтинг: 0 / 0
15.04.2020, 19:29
    #39947716
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Если запрос сложный - то, возможно, лучше один раз написать
EB-блок, который будет скрупулёзно проходить и проверять
все условия, делать все расчёты и т.д.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.04.2020, 20:03
    #39947743
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
_Vasilisk_Добавлять GROUP BY по всем полям мастера?

Да. Или оборачивать деталь в ДТ с группировкой и блэкджеком.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.04.2020, 22:13
    #39947778
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Почему банальный встроенный select не?
...
Рейтинг: 0 / 0
16.04.2020, 17:20
    #39948129
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Гаджимурадов Рустам
EB-блок
В смысле EXECUTE BLOCK? Так а чем он лучше обычной процедуры?
...
Рейтинг: 0 / 0
16.04.2020, 18:06
    #39948168
AltHasp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
_Vasilisk_,

авторEXECUTE BLOCK? Так а чем он лучше обычной процедуры?
EB - выполняется на стороне клиента. И не зачем плодить мульон ХП.
...
Рейтинг: 0 / 0
16.04.2020, 18:24
    #39948176
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
AltHaspEB - выполняется на стороне клиента.

чушь. EB выполняется на сервере конечно.
Разница между EB и ХП в том, что EB не хранится на сервере, и что текст EB можно формировать на лету с клиента.
...
Рейтинг: 0 / 0
16.04.2020, 18:36
    #39948183
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
_Vasilisk_> Так а чем он лучше обычной процедуры?

В данном случае его надо сравнивать не с ХП, а с запросом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.04.2020, 19:33
    #39948200
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
AltHasp
И не зачем плодить мульон ХП.
Кому они мешают?
Симонов Денис
EB можно формировать на лету с клиента.
Идея понятна.
...
Рейтинг: 0 / 0
21.04.2020, 19:16
    #39949582
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Dimitry Sibiryakov
Код: sql
1.
when count(distinct f2) = 1

А как быть с NULL?
Код: sql
1.
when count(distinct coalesce(f2, -1)) = 1

?
...
Рейтинг: 0 / 0
22.04.2020, 08:51
    #39949859
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
case f2 is distinct ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.04.2020, 15:13
    #39951039
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Гаджимурадов Рустам
case f2 is distinct ?
Это как? Есть IS DISTINCT FROM но ему нужно с чем то сравнивать
...
Рейтинг: 0 / 0
24.04.2020, 15:30
    #39951046
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
На SO советуют так
Код: sql
1.
count(distinct col1) + count(distinct case when col1 is null then 1 end)
...
Рейтинг: 0 / 0
27.04.2020, 12:47
    #39951920
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
_Vasilisk_
А как быть с NULL?
Так что нас-то спрашиваешь.
Это ты скажи. Оно как отдельное уникальное значение считается или как?
...
Рейтинг: 0 / 0
28.04.2020, 19:23
    #39952516
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
WildSery
Оно как отдельное уникальное значение считается или как?
Да
...
Рейтинг: 0 / 0
29.04.2020, 11:20
    #39952755
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
Здесь 2 запроса будет, а join или вложенный уже по ситуации.
Первый с группировкой должен посчитать f2.
Код: sql
1.
case when count(distinct f2) = 1 and count(*) = count(f2) then max(f2) else -1 end
...
Рейтинг: 0 / 0
29.04.2020, 17:12
    #39952949
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
WildSery
Код: sql
1.
case when count(distinct f2) = 1 and count(*) = count(f2) then max(f2) else -1 end

Если все значения NULL, то работать не будет
...
Рейтинг: 0 / 0
29.04.2020, 17:57
    #39952975
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
_Vasilisk_
Если все значения NULL, то работать не будет
Да, действительно.
Код: sql
1.
case when count(distinct f2) = 1 and count(*) = count(f2) or count(f2) = 0 then max(f2) else -1 end
...
Рейтинг: 0 / 0
29.04.2020, 19:22
    #39953030
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
WildSery
Да, действительно.
Код: sql
1.
case when count(distinct f2) = 1 and count(*) = count(f2) or count(f2) = 0 then max(f2) else -1 end

И чем это лучше вот этого?
_Vasilisk_
На SO советуют так
Код: sql
1.
count(distinct col1) + count(distinct case when col1 is null then 1 end)

...
Рейтинг: 0 / 0
30.04.2020, 11:00
    #39953199
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка с группировкой
_Vasilisk_,

Ничем.
Я не прочитал до того, как автор не назвал условия подсчёта нулов.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка с группировкой / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]