Это вернет все родительские записи, у которых есть [по крайней мере] один ребенок с foo 'fizz' И [по крайней мере] один ребенок с foo 'buzz'. Что, я думаю, требуется в вопросе.
Кроме того, будучи потенциально неоптимальным, этот запрос является общим в том смысле, что он будет работать с большинством реализаций SQL, а не только с более современными, где поддерживается поддержка CTE, подзапросов и связанных конструкций.
SELECT DISTINCT Parent.ID
FROM Parent
JOIN Child C1 ON Parent.ID = C1.parent_Id
JOIN Child C2 ON Parent.ID = C2.parent_id
WHERE C1.foo = 'fizz'
AND C2.foo = 'buzz'
Редактировать
Теперь, когда Джоэл Поттер исправил запрос в своем ответе, мы, вероятно, согласны, что его подход имеет несколько преимуществ по сравнению с запросом, перечисленным выше (пожалуйста, дайте ему несколько + повторений). В частности:
- структура запроса не изменяется, когда мы добавляем или удаляем целевые значения для столбца foo.
- запрос, вероятно, легче оптимизировать [самим сервером]
- структура запроса позволяет ему обрабатывать изменения в определении фильтра. Например, мы можем запросить всех родителей, у которых есть дети, например, что присутствуют 2 из 5 возможных значений foo.
Ниже приведен слегка измененный запрос Джоэля, показывающий, как его можно расширить для более чем двух значений foo.
SELECT Parent.Id
FROM Parent
INNER JOIN Child on Parent.Id = child.parent_id
WHERE Child.foo IN ('fizz', 'buzz') -- or say, ... IN ('fizz', 'buzz', 'bang', 'dong')
GROUP BY Parent.Id
HAVING COUNT(DISTINCT Child.foo) = 2 -- or 4 ...