我有一个表格数据,如下所示。
您可以通过运行以下脚本
生成相同的内容
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或ProductId相同
执行此操作的最佳方法是什么?欣赏相同的运行代码,以便我的输入可以在相同的位置验证?
答案 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;