使用不同的dob-tsql(T-SQL)查找重复的名称



我想在结果集中获得具有不同dob和dob的唯一重复名称。我不想要不重复的行。

我尝试了CTE和Group By和Having的组合。

declare @person table (id int, e_name nvarchar(50), dob datetime)
INSERT @person VALUES (1,'Jack Hughens','1960-11-02')
INSERT @person VALUES (2,'Tom Hughens','1971-01-08')
INSERT @person VALUES (3,'Sam Scallion','1960-11-02')
INSERT @person VALUES (4,'Sam Scallion','1960-11-01')
INSERT @person VALUES (5,'Paul Darty','1994-10-19')
INSERT @person VALUES (6,'Paul Ashley','1983-09-21')

结果应该如下:

--------------------------------
|id|e_name         |dob         |
--------------------------------
|3|Sam Scallion   |1960-11-02  |
--------------------------------
|4|Sam Scallion   |1960-11-01  |
--------------------------------

如果id是自动的,那么您可以执行:

select p.*
from @person p
where exists (select 1 from @person p1 where p1.e_name = p.e_name and p.id <> p1.id);

但是,您也可以使用dob而不是id:

select p.*
from @person p
where exists (select 1 from @person p1 where p1.e_name = p.e_name and p.dob <> p1.dob);

我的建议使用带有HAVING-子句的GROUP BY

模型表模拟您的问题

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的集合,因此将其用作筛选器。

最新更新