Как я уже сказал, я отправляю свою более простую версию ответа piclrow. Я тестировал это на своем Firebird, который является версией 2.5, но OP (Steve) протестировал его на 2.1, и он также работает.
SELECT id
FROM table
WHERE label IN ('Apple', 'Pear', 'Peach')
GROUP BY id
HAVING COUNT(DISTINCT label)=3
Это решение имеет тот же недостаток, что и знак абзаца в ... Вы должны знать, сколько значений вы ищете, как HAVING = условие должно соответствовать где в состоянии. В этом отношении ответ Эд более гибкий, так как он разбивает параметр конкатенированной строки значений и подсчитывает значения. Таким образом, вам просто нужно изменить один параметр, вместо двух условий, которые я и пиккруу используют.
OTOH, если эффективность вызывает беспокойство, я бы предпочел (но я абсолютно не уверен), что подход EdE от Ed может быть менее оптимизирован с помощью двигателя Firebird, чем тот, который я предлагаю. Firebird очень хорош в оптимизации запросов, но я действительно не сейчас, если это возможно, когда вы используете CTE таким образом. Но WHERE + GROUP BY + HAVING следует оптимизировать, просто имея индекс на (id, label).
В заключение, если время выполнения вызывает беспокойство в вашем случае, то вы, вероятно, потребуются некоторые объяснить планы увидеть, что происходит, в зависимости от решения вы выбрали;)
В вашем запросе (или пиккрау) нет CTE (или табличного выражения) –
Этот комментарий был отнесен к ответу Эд, который является приятным и гибким, но ** использует ** CTE. Я сделаю это более ясным.Спасибо – Frazz
Работает также с FB2.1. Я отвечу на это как на ответ, так как это самый простой запрос. Благодаря! – Steve