2016-10-14 14 views
0

我知道類似這樣的問題之前已經被問到過,但我還沒有看到超過2個表中的一個。似乎有區別。SQL EXISTS返回所有行,超過兩個表

我有我需要的字段,三個表customers我需要customerIDorderID來自orders從中我得到customerIDorderIDlineitems從中我得到orderIDquantity(=訂購的數量)。

我想找出有多少客戶購買了超過2相同的項目,所以基本上數量> 2:

SELECT COUNT(DISTINCT custID) 
FROM customers 
WHERE EXISTS(
    SELECT * 
    FROM customers C, orders O, lineitems L 
    WHERE C.custID = O.custID AND O.orderID = L.orderID AND L.quantity > 2 
    ); 

我不明白爲什麼它返回了我所有的行數。我在檢查> 2條件之前關聯了子查詢,我不是嗎?

我是一名SQL初學者,所以我會很感激你能否從根本上解釋它,如果有必要的話。謝謝。

回答

2

您不必在EXISTS子查詢中重複customers表。這是關聯的想法:使用外部查詢的表來關聯。

SELECT COUNT(DISTINCT custID) 
FROM customers c 
WHERE EXISTS(
    SELECT * 
    FROM orders O 
    JOIN lineitems L ON O.orderID = L.orderID 
    WHERE C.custID = O.custID AND L.quantity > 2 
    ); 
+0

所以錯誤是由重複客戶造成的?或者使用'JOIN'而不是'FROM ... WHERE ...'在使用多個表時也有所作爲? – sandboxj

+1

@sandboxj是的錯誤是由於客戶再次使用表:這是錯誤的關聯的想法。最好在上面的查詢中使用現代的'JOIN'語法,而不是使用逗號分隔表的舊式語法。 –

1

我會處理這兩個集合:

select count(distinct customerid) 
from (select o.customerid, l.itemid, count(*) as cnt 
     from lineitems li join 
      orders o 
      on o.orderID = l.orderId 
     group by o.customerid, l.itemid 
    ) ol 
where cnt >= 2; 

內查詢計算每個客戶購買商品的數量。外部統計顧客的數量。

編輯:

我可能誤解了上述答案的問題。如果你只是想在那裏quantity >= 2,那是很容易:

select count(distinct o.customerid) 
from lineitems li join 
    orders o 
    on o.orderID = l.orderId 
where l.quantity >= 2; 

這可能是表達查詢的最簡單方法。

0

我建議你使用 「連接」,

試試這個

選擇 COUNT(*) 從 級O 內對 l.orderID = o.orderID加入 了LineItem升 其中 l.quantity> 2