查找两列重复记录的唯一记录

时间:2018-10-24 10:38:00

标签: sql sql-server tsql duplicates unique

这是我的数据库数据集:

ID             Name

XXX-23305      Edward, Stue^Jenna
XXX-23305      Edward, Stue^Jenna
XXX-23306      Cole, Slaw^Bali
XXX-23306      Cole, Slaw^Bali
XXX-23306      Cole, Slaw^Bali
XXX-23310      Zerg, War^Finja
XXX-23310      Road^Sieglinde
XXX-23319      Gras, Dr.Carl^Yolo
XXX-23319      Gras, Dr.Carl^Yolo

如您所见,同一ID和名称组合可能会有多个条目。 但是,对于ID XXX-23310,有两个不同的名称可用。

现在我要显示的是确切的数据集(我有一个大约31k条目的数据库,其中这些条目的数量未知)。

有没有办法做到这一点?我用谷歌搜索了一段时间,也浏览了这里的其他帖子,但找不到任何东西。

EDIT1:查询的所需输出:

ID             Name

XXX-23310      Zerg, War^Finja
XXX-23310      Road^Sieglinde

EDIT2:

不确定是否有人阅读过此内容,但感谢您的解决方案。我想添加另一个条件。仅在ID包含多个条目的地方输出数据。例如。如果我的样本数据集仅包含XXX-23310的一项,则查询结果将不会显示任何内容。

3 个答案:

答案 0 :(得分:1)

在过滤器中使用聚合功能

由于您只想考虑多个ID,因此请在一个以下使用

select id,name from @your_table t
group by id,name
having count(*)=1
and exists (select 1 from @your_table t1 where t1.id=t.id
                          group by t1.id having count(*)>1
                           )

DEMO in fiddle

输出

id            name
XXX-23310   Road^Sieglinde
XXX-23310   Zerg, War^Finja

答案 1 :(得分:1)

如果您还想排除给定ID的任何单独记录:

create table #data
(
    id varchar(10),
    [name] varchar(50)
)

insert into #data
values
    ('XXX-23305','Edward, Stue^Jenna'),
    ('XXX-23306','Cole, Slaw^Bali'),
    ('XXX-23306','Cole, Slaw^Bali'),
    ('XXX-23306','Cole, Slaw^Bali'),
    ('XXX-23310','Zerg, War^Finja'),
    ('XXX-23310','Road^Sieglinde'),
    ('XXX-23319','Gras, Dr.Carl^Yolo'),
    ('XXX-23319','Gras, Dr.Carl^Yolo');

with d as
(   
    select distinct
        id,
        [name]
    from #data
)
select *
from d
where d.id in
(   
    select d.id
    from d
    group by d.id
    having count(*) > 1
)

drop table #data

返回XXX-23310的两条记录,但不返回XXX-23305的其他记录:

/-----------------------------\
| id        | name            |
|-----------|-----------------|
| XXX-23310 | Road^Sieglinde  |
| XXX-23310 | Zerg, War^Finja |
\-----------------------------/

答案 2 :(得分:0)

尝试一下:

DECLARE @DataSource TABLE
(
    [ID] VARCHAR(32)
   ,[Name] VARCHAR(25)
);

INSERT INTO @DataSource ([ID], [Name])
VALUES ('XXX-23305', 'Edward, Stue^Jenna')
      ,('XXX-23305', 'Edward, Stue^Jenna')
      ,('XXX-23306', 'Cole, Slaw^Bali')
      ,('XXX-23306', 'Cole, Slaw^Bali')
      ,('XXX-23306', 'Cole, Slaw^Bali')
      ,('XXX-23310', 'Zerg, War^Finja')
      ,('XXX-23310', 'Road^Sieglinde')
      ,('XXX-23319', 'Gras, Dr.Carl^Yolo')
      ,('XXX-23319', 'Gras, Dr.Carl^Yolo');

WITH DataSource AS
(
    SELECT [ID]
          ,[Name]
          ,COUNT(*) OVER (PARTITION BY [ID], [Name]) AS [ID_Name_Count]
          ,COUNT(*) OVER (PARTITION BY [ID]) AS [ID_Count]
    FROM @DataSource
)
SELECT [ID]
      ,[Name]
FROM DataSource
WHERE [ID_Name_Count] = 1
    AND [ID_Count] = 2;

enter image description here