使用INTERSECT的SELECT语句

Sha*_*hai 2 sql oracle select intersect

我有两个表: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
Run Code Online (Sandbox Code Playgroud)

Rob*_*ley 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))
;
Run Code Online (Sandbox Code Playgroud)

但我想也许您只是想使用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)
;
Run Code Online (Sandbox Code Playgroud)