Join

自加入?還是我錯了?

  • November 9, 2018

我們有一張桌子用來存放顧客和物品。我們需要能夠找到已經購買了一件商品但沒有購買另一件商品的客戶:

customer     item  
Sally        1   
Sally        2  
Sally        3
John         1  
John         2  
Paul         2
Paul         3

我們希望找到購買“1”而不是“3”的使用者。在這種情況下,我們只需要“John”。

不,自聯接並沒有真正的幫助,但是如果您的數據庫系統有一個 EXCEPT 運算符(或類似的東西,在 Oracle 中它被稱為 MINUS)它會。

以下是您獲得結果的方式:

SELECT customer FROM Sales
WHERE item = 1
AND customer NOT IN (SELECT customer FROM Sales WHERE item = 3)

如果您有一個 EXCEPT 運算符:

SELECT customer FROM Sales WHERE item = 1
EXCEPT
SELECT customer FROM Sales WHERE item = 3

另一種使用聚合的方法:

SELECT customer 
FROM sales
GROUP BY customer
HAVING MAX( CASE item WHEN 1 THEN 1
                     WHEN 3 THEN 2
                            ELSE 0 END ) = 1;

Case 將 item-list 轉換為 1 表示好項目,2 表示不需要的項目,每隔一個項目都為零。如果一個好項目在客戶的列表中,最大值將是 10,如果一個壞項目在列表中,則最大值為 2,否則為 0。

引用自:https://dba.stackexchange.com/questions/80322