2016-05-31 6 views
2

表1の3列目の2つの値は、表2の列であり、これらの列にデータが移入されSQLクエリ - 二つの異なる列のシングルカラム値

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 

のは、私は次の2つの表があるとしましょうtable1.column2に保存します。

ここで、テーブル1の各グループ(table1.column1に基づくグループ)に対して、テーブル2のすべての値がすべてDEFの値になるようにSQLクエリを作成する必要があります。 Xが列にB及びCの両方を有するのでtable2.column2と例えばtable2.column3

GHI値のすべてのグループを、特定のテーブルのために、私の期待される出力のみX.であるべきですDEFであり、列GHIにはDとEがあります。一方、ZはDEF列にCを含まない。

私はどのように進むべきか、私はそれについてどうすればいいですか?

+0

あなたは、関連するデータベース(私は推測しているオラクル)でタグ付けしてくださいことはできますか? 'PIVOT'はあなたが探しているものです。 –

+0

PIVOTはこの場合どのように私を助けますか? –

+0

あなたの質問を誤解しました - あなたがt1からt2を取得しようとしていると思った –

答えて

2

これは複雑に思えます。私はあなたがテーブル2からテーブル1への結合を2回(それぞれの列につき1回)行うことができると思います。これにより、それぞれtable1.col1のすべての一致が得られます。

次に、クエリは結果を集約し、すべての一致が完了したかどうかを確認できます。この2つの次元に沿って発生している、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; 
+0

ありがとうございます。私はそれを試してみましょう! :D –

関連する問題