我想在结果集中获得具有不同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的集合,因此将其用作筛选器。