这是一个令人费解的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?
答案 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