Na pytanie, publikuję moją prostszą wersję odpowiedzi piclrowa. Przetestowałem to na moim Firebird, który jest w wersji 2.5, ale OP (Steve) przetestował go na 2.1 i działa również.
SELECT id
FROM table
WHERE label IN ('Apple', 'Pear', 'Peach')
GROUP BY id
HAVING COUNT(DISTINCT label)=3
To rozwiązanie ma tę samą wadę, co pilcrow w ... trzeba wiedzieć, ile wartości szukasz, jak BIORĄC = warunek musi dopasować gdzie w stanie. Pod tym względem odpowiedź Eda jest bardziej elastyczna, ponieważ dzieli parametr łańcucha wartości i zlicza wartości. Musisz więc zmienić tylko jeden parametr, zamiast 2 warunków, które ja i pilcrow używam.
OTOH, jeśli wymuszenie jest niepokojące, wolałbym raczej (ale absolutnie nie jestem pewien), że podejście CTE Eda może być mniej optymalizowane przez silnik Firebird, niż ten, który sugeruję. Firebird jest bardzo dobry w optymalizacji zapytań, ale tak naprawdę nie teraz, jeśli jest w stanie to zrobić, gdy używasz CTE w ten sposób. Ale WHERE + GROUP BY + HAVING powinien być optymalizowany przez proste posiadanie indeksu na (identyfikator, etykieta).
Podsumowując, jeśli czasy wykonania budzą obawy w Twoim przypadku, to prawdopodobnie trzeba Niektórzy tłumaczą plany, aby zobaczyć, co się dzieje, cokolwiek rozwiązanie wybrać;)
W zapytaniu użytkownika (lub pilcrow) nie ma CTE ("common table expression"). –
Ten komentarz został skierowany do odpowiedzi Eda, która jest dobra i elastyczna, ale ** robi ** używa CTE. Sprawię, że będzie jaśniejszy.Dzięki – Frazz
Działa również z FB2.1. Przyjmę to jako odpowiedź, ponieważ jest to najprostsze zapytanie. Dzięki! – Steve