如何编写查询以匹配记录组

时间:2018-05-16 23:13:09

标签: sql tsql

这是一个令人费解的SQL任务。我希望通过查询来完成它,而不是单步执行游标并按照"艰难的方式进行操作"。

如果我有两个表TableA和TableB,每个表都有一个分组列,如下所示:

TableA             TableB
-------------      -------------
id     group       id     group
------ ------      ------ ------
1      D           1      X
2      D           2      X
3      D           3      Y
4      D           4      Y
4      E           5      Y
5      E           5      Z
5      F           6      Z

请注意,群组名称​​不是的名称相同。

我想知道给定的TableB组是否完全由ID组成,这些ID也在TableA中的任何组中组合在一起。 TableA组可以拥有比TableB组更多的ID,只要它具有与TableB组相同的所有ID。 ID可以在任何一个表中的多个组中。

从上表中,我应该发现TableB中的组X与TableA中的组匹配,但组Y和Z不匹配。

我尝试了很多不同的查询,子查询,递归CTE。我结果只是错误的结果和头痛。真实数据集明显更大,因此性能也应该被视为一个因素。不幸的是,这意味着下面的答案中提出的交叉连接解决方​​案不会起作用。

这是否可以用SQL?

2 个答案:

答案 0 :(得分:1)

此查询的想法是将每个组都考虑到每个其他组。然后计算ID匹配的次数。这涉及cross join生成所有组对,然后是一些连接和聚合:

select b.group, a.group
from (select group, count(*) as cnt b group by group) bg cross join
     (select distinct group a) ag left join
     b
     on b.group = bg.group left join
     a
     on a.group = ag.group and a.id = b.id
group by bg.group, ag.group, bg.cnt
having bg.cnt = count(a.id)

答案 1 :(得分:0)

此查询可以给出答案。

SELECT B.[group] 
FROM 
   TableB B
   FULL JOIN TableA A ON B.id = A.id
GROUP BY 
   B.[group]
HAVING 
   COUNT(DISTINCT A.[group]) = 1