这是我的数据库数据集:
表
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的一项,则查询结果将不会显示任何内容。
答案 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
)
输出
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;