Мое предложение использует GROUP BY
с HAVING
-классом:
Таблица макетов для имитации вашей проблемы
declare @person table (id int, e_name nvarchar(50), dob datetime)
INSERT @person VALUES (1,'Jack Hughens','19601102')
INSERT @person VALUES (2,'Tom Hughens', '19710108')
INSERT @person VALUES (3,'Sam Scallion','19601102')
INSERT @person VALUES (4,'Sam Scallion','19601101')
INSERT @person VALUES (5,'Paul Darty', '19941019')
INSERT @person VALUES (6,'Paul Ashley', '19830921');
- Запрос
WITH FindNames AS
(
SELECT p.e_name
FROM @person p
GROUP BY p.e_name
HAVING COUNT(DISTINCT p.dob)>1
)
SELECT p.*
FROM @person p
INNER JOIN FindNames n ON p.e_name=n.e_name;
идея вкратце:
Использование COUNT(DISTINCT p.dob)
приведет к подсчету отличающихся только значений.
CTE вернет имена, где вы видите более одного, но разные DOB.
Последний SELECT присоединится к набору CTE, следовательно, используя его в качестве фильтра.