2

我有两个表:具有产品列表的 tblProduct 和具有消费产品 ID 的消费者名称的 tblConsumer。现在我需要从产品表中找到消费过所有产品的消费者的姓名。

我尝试使用 INTERSECT 来解决这个问题,但问题是我在 WHERE 子句中提供了每个 productid。这个语法给出了我想要的结果,但是我如何在不需要指定每个产品 ID 的情况下编写这个查询。

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 来消除那些没有为他们买过唱片的消费者。

像这样:

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)

如果您也添加一个新条目,它将起作用。它只是检查是否有任何记录,您无法在给定的消费者和产品之间建立联系。

于 2012-08-27T05:07:03.160 回答