2012-08-27 88 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) 

,如果你添加新條目也將正常工作。它只是檢查,是否有任何記錄,哪裏不能連接給定的消費者和產品。