SQL查询 - 两个不同列中的单列值

时间:2016-05-31 10:36:13

标签: sql oracle relational-division

假设我有以下两个表

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

有人可以指导我如何继续,我应该怎么做呢?

1 个答案:

答案 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;