2

製品のリストを持つ tblProduct と、消費された製品 ID を持つ消費者名を持つ tblConsumer の 2 つのテーブルがあります。ここで、製品テーブルからすべての製品を消費した消費者の名前を見つける必要があります。

INTERSECT を使用してこれを解決しようとしましたが、問題は、WHERE 句で各 productid を指定したことです。この構文は私が望んでいた結果をもたらしますが、各 productID を指定する必要がないこのクエリをどのように記述すればよいでしょうか。

SELECT ConsumerName  FROM tblConsumer  WHERE ProductID=  1
INTERSECT
SELECT ConsumerName  FROM tblConsumer  WHERE ProductID  =2
INTERSECT
SELECT ConsumerName  FROM tblConsumer  WHERE ProductID  =3


tblProduct
---------------------------------
ProductID  |  Product Name
---------------------------------
    1      |  Mango
    2      |  Orange
    3      |  Banana

tblConsumer
---------------------------------
ConsumerName | ProductID
---------------------------------
David        | 1
David        | 3
David        | 2
Henry        | 3
Henry        | 2
4

2 に答える 2

6

実際に tblProducts 内のすべての製品をリストしたい場合は、NOT EXISTS を使用できます...

それ以外の場合、確認したい製品のリストがある場合は、次のようにすることができます。

SELECT c.ConsumerName
FROM tblConsumer AS c
WHERE c.ProductID IN (1,2,3)
GROUP BY c.ConsumerName
HAVING COUNT(DISTINCT c.ProductID) = (SELECT COUNT(DISTINCT p.ProductID) FROM tblProduct WHERE p.ProductID IN (1,2,3))
;

しかし、NOT EXISTS を使用して、購入していないレコードがある Consumer を排除したいだけかもしれません。

このような:

SELECT *
FROM tblPerson AS pn CROSS JOIN tblProduct AS pt /* Every possible combo */
WHERE NOT EXISTS (SELECT * FROM tblConsumer c 
                  WHERE c.ConsumerName = pn.ConsumerName 
                  AND c.ProductID = pt.ProductID)
;
于 2012-08-27T04:00:00.700 に答える
0

私は他の小さな解決策を持っています:

SELECT * FROM tblConsumer 
WHERE NOT EXISTS (SELECT * FROM tblProduct
              LEFT JOIN tblConsumer C ON tblProduct.ProductID  = C.ProductID  AND tblConsumer .ConsumerName = C.ConsumerName 
              WHERE C.ConsumerName IS NULL)

新しいエントリも追加すると機能します。指定された Consumer と Product の間に接続を確立できないレコードがあるかどうかを確認するだけです。

于 2012-08-27T05:07:03.160 に答える