2017-12-07 7 views
-2

4つのテーブルのフィールドを組み合わせて特定の関係を持つフィールドを示す回答を得ようとしています。ここでSQL:対応する一致するフィールドを持つすべてのフィールドの取得

は、関連するテーブル&フィールドです:

lowproducts 
|productid| 

highproducts 
|productid| 

orders 
|productid|customerid| 

inner join on productid 

注文は、得意先とのProductIDフィールドの両方のために多くの重複があります。低生産品と高品目には異なるproductid項目しかありません。私は必要なもの

これを実行するコードです:すべてのorders.customeridについて

:得意先のためのすべての行がhighproductsかlowproductsのいずれかでのProductIDを持つ フィールドだけを選択し

サンプル・テーブル・データ

lowproducts 
|productid|volume|price| 
|1111|8|2.95 
|2222|7|1.37 



highproducts 
|productid|weight|price| 
|3333|25|9.99 
|4444|22|8 

orders 
|productid|customerid| 
|1111|abcd 
|2222|abcd 
|1111|efgh 
|2222|efgh 
|3333|efgh 
|4444|efgh 

inner join on productid 

select customerid, productid 
where (orders.productid = highproducts.productid) or (orders.productid = lowproducts.productid) 

それは私にすべての試合を取得します。それは私にとっては難しいことではありません。しかし、私はどのようにして、特定の顧客IDのすべての注文を表すマッチを返すようにするためにそれをどのように修正するのですか(つまり、顧客IDの注文のいずれも2つのテーブルのいずれにもないproductidを持っていません)。

私が望む結果は、efghであり、abcdではありません。私は照会の中でabcdとefghの両方を取得する方法を知っていますが、efghだけではありません。

+0

参加し、グループ化する。 – Tomm

+2

サンプルテーブルのデータと予想される結果をフォーマットされたテキスト(イメージではなく)として追加し、現在のクエリの試行を表示します。 – jarlh

+0

低品位品と高品位品の違いは何ですか?あなたはテーブルを1つしか持てませんか? – jarlh

答えて

0

WHERE NOT EXISTSを使用できるように、他の製品テーブルの指図が存在するレコードを除外します。たとえば、連合それら一緒に、顧客がhighproductsを注文しなかった注文を取得する受注が続いてlowproductsのために同じことを行うhighproductsテーブル内の製品とその顧客ためを存在するレコードを除外してするには:

SELECT *, 'only low' as type FROM orders o 
WHERE NOT EXISTS 
(SELECT * FROM orders p 
JOIN highproducts on p.productid=highproducts.productid 
WHERE o.customerid = p.customerid) 
UNION 
SELECT *, 'only high' FROM orders o 
WHERE NOT EXISTS 
(SELECT * FROM orders p 
JOIN lowproducts on p.productid=lowproducts.productid 
WHERE o.customerid = p.customerid) 
関連する問題