SQL查询-按几列过滤有效和无效数据

时间:2019-02-01 10:50:36

标签: sql-server

我有一个表格数据,如下所示。

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或ProductId相同

enter image description here

执行此操作的最佳方法是什么?欣赏相同的运行代码,以便我的输入可以在相同的位置验证?

3 个答案:

答案 0 :(得分:4)

认为这就是你所追求的:

this.http.get('placeholder-api',{someBodyData}).subscribe(
  response => {
    results = [...response, ...myInMemoryDbArray]
  }
);

这至少会返回您所追求的结果:

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 以获得其他结果;如果您不能这样做,则表示您不理解上述代码,因此应询问其工作原理。

答案 1 :(得分: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

答案 2 :(得分:0)

使用与Larnu的评论类似的方法,代替使用Temp tale的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;