假设我有以下两个表
Table 1
Column1 Column2 Column3
1 A ABC
1 B DEF
1 C DEF
1 D GHI
1 E GHI
2 A1 ABC
2 B1 DEF
2 C1 DEF
2 D1 GHI
Table 2
Column1 DEF GHI
X B D
X C D
X C E
X G D
Z B D
表1第3列的两个值是表2中的列,这些列使用table1.column2中的数据填充。
现在,我需要编写一个SQL查询,以便对于表1中的每个组(基于table1.column1的组),我能够获得表2中包含所有 DEF <的所有值。 / strong> table2.column2中组的值以及table2.column3中的所有 GHI 值
例如,对于给定的表,我的预期输出应该只是X.因为X在列DEF中同时具有 B和C 并且同时具有 D和E 专栏GHI。另一方面,Z在DEF列中不包含 C 。
有人可以指导我如何继续,我应该怎么做呢?
答案 0 :(得分:2)
这看起来很复杂。我想你可以从表2连接到表1两次 - 每列一次。这将获得每个table1.col1
的所有匹配。
然后,查询可以聚合结果并检查所有匹配是否完成。因为这是沿着两个维度发生的,所以having
子句需要使用count(distinct)
:
select t2.col1, t1.col1
from table2 t2 join
table1 tdef
on tdef.col3 = 'DEF' and tdef.col2 = t2.def join
table1 tghi
on tghi.col3 = 'GHI' and tghi.col2 = t2.ghi and tghi.col1 = tdef.col1 join
(select sum(case when t1.col3 = 'DEF' then 1 else 0 end) as cnt_def,
sum(case when t1.col3 = 'GHI' then 1 else 0 end) as cnt_ghi
from table1 t1
) tt1
on tt1.col1 = tdef.col1
group by t2.col1
having count(distinct tdef.col2) = tt1.cnt_def and
count(distinct tghi.col2) = tt1.cnt_ghi;