2017-02-21 11 views
3

私はこれを最初に尋ねた人だとは思えませんが、以下のクエリを実行する正しい方法を見つけるのが難しいです。 論理的にはかなりシンプルなようですが、コード化するのに苦労しています1テーブル内のすべてのリストが別のテーブルと一致する場所を選択

私は2台のテーブルを持っていますが、テーブル1のすべての車とcust_idを取得したいと思います。車が)表1から色を一致する 争点は、私が参加して実験してきた2

、存在し、交差するが、無駄 すべてに表にする必要はありませ表1の色のすべてのことです少なくとも1つの項目が一致する場合、以下のようなコードが一致しますが、すべて一致するわけではありません。

SELECT 
a.Cust_Id, 
a.Car 
FROM Table1 a 
JOIN Table2 b ON a.Car = b.Car and a.Colour = b.Colour 
GROUP BY a.Cust_Id, a.Car 

それは、私が一例として、自動車/色を使用し、それはこの文脈ではあまり意味がありません感謝していますので、他の多くのことをやってはるかに大きなスクリプトの一部です。

グループごとに表1

enter image description here

表2

enter image description here

予想される出力

Output 
1 Audi 
1 Ford 
2 VW 
+0

表の例と予想される出力を追加しました。 – gregdanish

+0

@TimBiegeleisen、答えはイエスですが、OPの質問では答えられません。 – jarlh

答えて

4

、からNULL色の数を数えますとこの数がゼロであることを確認します。これは、第2のテーブルのすべての色が第1のテーブルの色にマッピングされることを意味する。

SELECT b.Cust_Id, 
     b.Car 
FROM Table1 a 
RIGHT JOIN 
(
    SELECT 1 AS Cust_ID, Car, Colour 
    FROM Table2 
    UNION ALL 
    SELECT 2, Car, Colour 
    FROM Table2 
) b 
    ON a.Car = b.Car  AND 
     a.Colour = b.Colour AND 
     a.Cust_ID = b.Cust_ID 
GROUP BY b.Cust_Id, 
     b.Car 
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0 

2番目の表の色要件を強化するためにサブクエリを使用したことに注意してください。私はCust_IDという列を追加しました。すべての顧客が同じ要件を持っていると仮定して、結合をより簡単に処理および分析できるようにしました。

+0

ありがとう、ティム、私はあなたのロジックに同意しますが、この出力はCust 1とAudiとVW for Cust 2のためにフォードとVWを提供します。 – gregdanish

+0

各車に2番目の表の色を_all_したいですか? –

+0

はい、すべての色がtable2にある場合のみ、table1のすべてのレコードが表示されます。したがって、両方の色がtable2にあるため、AudiとFordはcust_id 1を表示します。しかし、VW Table1は青と黒を持っている必要があります – gregdanish

0

私はそれを解決したと思う、右ジョイントの基準を少し修正し、私が実行したテストで動作するようだ。これに少し遅れ

SELECT b.Cust_Id, 
     b.Car 
FROM Table1 a 
RIGHT JOIN 
(
    SELECT b.Cust_ID, a.Car, a.Colour 
    FROM Table2 a, Table1 b 
    ) b 
    ON a.Car = b.Car  AND 
     a.Colour = b.Colour AND 
     a.Cust_ID = b.Cust_ID 
GROUP BY b.Cust_Id, 
     b.Car 
HAVING SUM(CASE WHEN a.Colour IS NULL THEN 1 ELSE 0 END) = 0 
1

私はあなたがすでに解決策を持って見るが、ここで私はそれはいくつかの使用であるかもしれない場合に思い付いたいくつかのSQLだと。私が質問を読んだやり方では、table1はさまざまな顧客からの車の希望リストであり、table2は自動車ディーラーから提供できるもののリストです。ディーラーは、どの車種の顧客が各車種の色の全範囲に興味があるかを知りたいと考えています。

select w.cust_id, w.car 
from table1 w join table2 s 
    on w.car=s.car and w.colour=s.colour 
group by w.cust_id, w.car 
having count(s.car)=(select count(*) from table2 where car=w.car); 
+0

ありがとうございます。また、動作するようです。 :) – gregdanish

関連する問題