我有两个表:tblProduct,它有产品列表,tblConsumer,它有消费者名称和消费的产品ID。现在我需要从产品表中找到已经消费了所有产品的消费者的名称。
我试图使用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
如果你真的想列出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来消除那些没有购买唱片的消费者。
像这样:
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)
;
我有另一个小的解决方案:
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)
如果你也添加一个新条目,它就会起作用。它只是检查,是否有任何记录,在那里你不能在给定的消费者和产品之间建立联系。