我具有如以下所示的表数据。
您可以通过运行下面的脚本生成相同的
DECLARE @Temp Table
(
Id varchar(50),
Name varchar(50),
ProductId varchar(50)
)
insert into @Temp values('1','O1','P1');
insert into @Temp values('1','O1','P2');
insert into @Temp values('2','O1','P1');
insert into @Temp values('3','O1','P3');
insert into @Temp values('4','O1','P4');
insert into @Temp values('5','O1','P4');
insert into @Temp values('6','O1','P6')
select * from @Temp
我想基于以下条件的两个不同的放出来
1)任何Id或productid是不相同
2)任一个ID或产品编号是相同
什么是做这个操作的最佳方式?欣赏运行代码相同的,所以我的输入,可以在相同的验证?
我想这是你所追求的:
WITH CTE AS(
SELECT Id,
[Name],
ProductId,
COUNT(ID) OVER (PARTITION BY ID) AS IDCount,
COUNT(ProductId) OVER (PARTITION BY ProductId) AS ProductCount
FROM @Temp)
SELECT Id,
[Name],
ProductId
FROM CTE
WHERE IDCount = 1 AND ProductCount = 1;
这至少,返回所在后的结果:
Id Name ProductId
--- ---- ---------
3 O1 P3
6 O1 P6
你应该能够轻松地改变WHERE
得到其他结果;如果你不能,这意味着你不明白上面的代码,因此,你应该问它是如何工作的。
你也可以试试这个
首先查询
Select * from @Temp
where Id in (
select Id from @Temp group by Id having Count(Id) = 1
)and ProductId in(
select ProductId from @Temp group by ProductId having Count(ProductId) = 1
)
第二个查询
Select * from @Temp
where Id in (
select Id from @Temp group by Id having Count(Id) > 1
)or ProductId in(
select ProductId from @Temp group by ProductId having Count(ProductId) > 1
)
要查看与输出完整的查询,您可以检查现场演示here。
用类似的方法从Larnu的评论,到位CTE的使用温度故事来存储结果,因此它可以在两个查询可重用。
DECLARE @TempCount Table
(
Id varchar(50),
Name varchar(50),
ProductId varchar(50),
IdCount int,
ProductCount int
)
insert into @TempCount
SELECT Id,
[Name],
ProductId,
COUNT(ID) OVER (PARTITION BY ID) AS IDCount,
COUNT(ProductId) OVER (PARTITION BY ProductId) AS ProductCount
FROM @Temp
--Get the unique records
SELECT *
FROM @TempCount
WHERE IDCount = 1 AND ProductCount = 1;
--Get the duplicate records
SELECT *
FROM @TempCount
WHERE IDCount > 1 OR ProductCount > 1;