Так как эта тема была очень полезна для меня, я решил поделиться своим решением.
У меня была похожая проблема, возможно, более общая, чем это конкретное сравнение с одним набором. Я пытался найти идентификатор элемента, который имел набор многоэлементных дочерних элементов, которые соответствовали набору запросов многоэлементных элементов.
Соответствующая информация о схеме:
table events, pk id
table solutions, pk id, fk event_id -> events
table solution_sources, fk solutionid -> solutions
columns unitsourceid, alpha
Запрос: найдите решение для события с идентификатором 110, у которого есть набор solution_sources, который соответствует набору (unitsourceid, alpha) в ss_tmp. (Полагаю, это можно сделать и без таблицы tmp.)
Решение:
with solutionids as (
select y.solutionid from (
select ss.solutionid, count(ss.solutionid) x
from solutions s, solution_sources ss
where s.event_id = 110 and ss.solutionid = s.id
group by ss.solutionid
) y where y.x = ( select count(*) from ss_tmp )
)
select solutionids.solutionid from solutionids where
(
select case
when count(*) = ( select count(*) from ss_tmp ) then true
else false
end
from
( SELECT unitsourceid, alpha FROM solution_sources
where solutionid = solutionids.solutionid
INTERSECT
SELECT unitsourceid, alpha FROM ss_tmp ) x
)
Проверено на соответствие тестового запроса из 4 элементов и тестовой базы данных, в которой было найдено соответствующее решение (одинаковое количество дочерних элементов, каждый из которых соответствует), нескольких полностью несовпадающих решений и 1 решения, которое имело 3 совпадающих дочерних элемента, 1 решение, которое имело все 4 совпадающих дочерних элемента, плюс дополнительный дочерний элемент, и 1 решение, которое имело 4 дочерних элемента, из которых 3 из 4 соответствовали запросу. Был возвращен только идентификатор истинного соответствия.
спасибо большое
-Linus