需要获取两列的组合都存在且不退出的行

时间:2014-03-31 11:29:06

标签: sql sql-server

试图弄清楚是否有可能编写一个基于集合的查询,以便在一个表中返回我想要的数据。下面只是一个例子,如果大多数(但不是全部)组合1到9(或1到20等)存在,我需要一些可以轻松工作的东西。

表AllCovered有两列。 ID1和ID2。这个表中有16行,每行包含1到4的数字组合(所以1,1 1,2 1,3 1,4 2,1 .... 4,3 4,4)

表SomeGaps具有相同的结构,但只有12行,每行又是1到4的组合,但缺少一些组合。

SELECT ID1, ID2, COUNT(ID1) as THIS
FROM AllCovered
GROUP BY ID1, ID2

- 此查询返回16行,每个组合在第3列(THIS)中为1

SELECT ID1, ID2, COUNT(ID1) as THIS
FROM SomeGaps
GROUP BY ID1, ID2

- 返回12行。 如何创建将返回16行的查询,每个组合但在此处为0,对于某些组合中缺少的组合?

ID1 ID2 THIS
 1   1   1
 1   2   0 (1,2 combination does NOT exist in SomeGaps)
 1   3   1
 1   4   1
 2   1   1
 2   2   0 (2,2 combination does NOT exist in SomeGaps)

显然我已尝试使用交叉连接来获取ID1和ID2的所有组合,但COUNT正如预期的那样大幅膨胀。

希望这是有道理的。抱歉,如果它是一个简单的解决方案,我似乎无法破解它!

2 个答案:

答案 0 :(得分:2)

您可以通过交叉连接两列的所有不同值来执行此操作。然后使用left outer join和聚合来获取所有组合的计数:

select ac.id1, ac.id2, count(ac.id1) as cnt
from (select distinct id1 from AllCovered) ac1 cross join
     (select distinct id2 from AllCovered) ac2 left join
     AllCovered ac
     on ac.id1 = ac1.id1 and ac.id2 = ac2.id2
group by ac.id1, ac.id2;

答案 1 :(得分:0)

我可能遗漏了一些显而易见的东西,但我还是会咬一口:

create table #AllCovered (id1 int, id2 int);
insert #AllCovered values
(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4),(3,1),(3,2),(3,3),(3,4),(4,1),(4,2),(4,3),(4,4);
create table #gaps (id1 int, id2 int);
insert #gaps values(1,1),(1,2),(1,3),(1,4),(2,1),(2,4),(3,1),(3,2),(3,3),(4,1),(4,2),(4,4);


select #AllCovered.id1, #AllCovered.id2,
count(#gaps.id1) as this
from #AllCovered 
left outer join #gaps
on #AllCovered.id1 = #gaps.id1 and #AllCovered.id2 = #gaps.id2
group by #AllCovered.id1, #AllCovered.id2;

drop table #AllCovered, #gaps

从你的叙述中,两个表中都没有(id1,id2)的重复组合,AllCovered包含所有可能的组合 - 否则将使用不同的子查询并制作AllCovered。