Показать сообщение отдельно
  #2  
Старый 11.02.2019, 21:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

С нестрогим поиском все понятно. Запрос с условием in () даст тебе все записи, где указаны соотв. типы. Т.е. нестрогий поиск будет выглядеть так:
Код:
select proposal_id
from devices
where sort_work_id in (:list)
group by proposal_id
Теперь по поводу строгого поиска.
Вариант 1. Когда нельзя ввести 2 заявки с одинаковыми proposal_id и sort_work_id.
Код:
select proposal_id
from devices
where sort_work_id in (:list)
group by proposal_id
having count(*) = :n
В чем суть. В запросе выбираюься записи с типм работ соотв. переданному в in списку, далее группируются по proposal_id и фильтруются по кол-ву. Т.е. если у тебя в списке 2 типа работ (помним, что этот вариант подразумевает, что для одной заявки оин тип работ может быть указан только один раз), то мы проверяем, что у нас всего 2 записи (ровно 2).

Теперь, если типы работ могут повторяться.
Фактически, мы сводим задачу к предыдущей путем "сворачивания" пары proposal_id/sort_work_id в уникальную комбинацию (ну и фильтр внутрь подзапроса перенесем для оптимизации):
Код:
select d.proposal_id
from 
(
  select distinct a.proposal_id, a.sort_work_id 
  from devices a
  where a.sort_work_id in (:list)
) d
group by d.proposal_id
having count(*) = :n
Ответить с цитированием