Это работает в SQL Server - написано до того, как ваш вопрос был помечен PostgreSQL.
Настройка данных теста:
DECLARE @Names TABLE (ID INTEGER IDENTITY, Surname VARCHAR(50), Forenames VARCHAR(50));
INSERT
@Names (Surname, Forenames)
VALUES
('Smith', 'John'),
('Smith', 'Mike'),
('Smith', 'Bob' ),
('Knope', 'John'),
('Knope', 'Mike'),
('Knope', 'Dick'),
('Pratt', 'John'),
('Pratt', 'Jill'),
('Pratt', 'James');
Объявите табличную переменную, содержащую имена, которые вы хотите сопоставить. Это действует как параметр, поэтому вы должны отредактировать значения, которые мы вставили, чтобы проверить результаты:
DECLARE @ForenamesToSearch TABLE (Forenames VARCHAR(50));
INSERT
@ForenamesToSearch
VALUES
('John')
, ('Mike')
, ('Bob');
Наконец, мы используем GROUP BY и HAVING COUNT, чтобы обеспечить точное совпадение количества имен.
SELECT
Surname
FROM
(SELECT DISTINCT Forenames, Surname FROM @Names) Names
INNER JOIN @ForenamesToSearch Forenames ON Names.Forenames = Forenames.Forenames
GROUP BY
Surname
HAVING
COUNT(1) = (SELECT COUNT(1) FROM @ForenamesToSearch);