2012-08-27 93 views
2

我有两个表:tblProduct,其中包含产品列表,tblConsumer具有使用产品ID的消费者名称。 现在我需要找到已从产品表中消费所有产品的消费者的姓名。使用INTERSECT的SELECT语句

我试图用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 
+0

请原谅我的无知,但是你的意思是'UNION',因为我不知道'INTERSECT'是一个sql语句。哦,并请指定您正在使用的数据库 –

+0

@AdrianCornish:INTERSECT是一种完美有效的方式来结合查询,PostgreSQL至少支持它:http://www.postgresql.org/docs/current/interactive/queries-union.html –

+0

@AdrianCornish - INTERSECT在许多RDBMS中有效。 –

回答

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) 
; 
+0

当我在tblProduct中添加名为Peach的新产品时,查询仍然在回应同一个消费者的姓名。添加新产品后,该语法不应该返回任何人的姓名,因为该附加产品不会被任何人使用。任何想法,为什么它不工作? – Shai

+0

因为存在WHERE c.ProductID IN(1,2,3) –

+1

是的,正如András指出的那样,我有第一个查询中感兴趣的ID列表。第二个查询是你可以使用的,如果你想要整个表,或者你可以从第一个查询中删除两个WHERE子句。 –

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) 

,如果你添加新条目也将正常工作。它只是检查,是否有任何记录,哪里不能连接给定的消费者和产品。