SQL查询 - 通过一些列的筛选有效及无效数据

问题描述 投票:3回答:3

我具有如以下所示的表数据。

enter image description here

您可以通过运行下面的脚本生成相同的

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是不相同

enter image description here

2)任一个ID或产品编号是相同

enter image description here

什么是做这个操作的最佳方式?欣赏运行代码相同的,所以我的输入,可以在相同的验证?

sql-server
3个回答
4
投票

我想这是你所追求的:

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得到其他结果;如果你不能,这意味着你不明白上面的代码,因此,你应该问它是如何工作的。


0
投票

你也可以试试这个

首先查询

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


0
投票

用类似的方法从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;
© www.soinside.com 2019 - 2024. All rights reserved.