2017-04-25 89 views
0

我需要做一個查詢,讓我REFC已全部責令同時使用計數,並且在不增加一倍至少一種類型的產品的客戶的計數的說法是:SQL雙NOT IN VS COUNT

SELECT NomC, RefC 
FROM client NATURAL JOIN commande NATURAL JOIN detail NATURAL JOIN PRODUIT 
WHERE TypeP IN ("clou", "cheville", "planche") 
GROUP BY NomC 
HAVING COUNT(DISTINCT TypeP) = 3; 

我遇到了雙重「NOT IN」等價物,並理解其背後的整體邏輯,以及:爲什麼我不能在這種情況下使用NOT EXISTS?任何幫助表示讚賞 Here is a schema of the database

+0

你應該真的執行你的查詢,它有助於學習sql。這個查詢既不會真正執行(不正確使用'「被列不匹配,選擇/組'爲MySQL> = 5.7),也不會得到期望的結果集(」有序至少一種類型的」獨特REFC的情況下,你會具有非唯一名稱)或(僅)預期結果列(「RefC」)。此外,您可以使用'not in',只要您可以使用'not exists',這就是您的老師想要的。如果可以的話,使用'not exists',然後將其重寫爲'not in'(通過將依賴列推到外面)。 – Solarflare

+0

首先,我建議永遠不要使用自然連接。一天,有人將一列添加碰巧具有相同的名稱作爲另一個表中的列的表。然後,使用幾個表時,你的資格列。最好的辦法是使用表別名(例如'從客戶C')和使用這些作爲限定符(例如'c.NomC')。最後:你應該使用標準的引號來表示字符串,這是單個''',而不是雙重的e'''。另外:NomC是否保證是唯一的? RefC進行分組會更自然,這似乎是客戶表的主鍵。 –

回答

0

這是與三個IN子句相同的查詢。您也可以使用EXISTS(您始終可以使用EXISTS而不是IN)。你不能使用NOT EXISTS爲什麼你會尋找?

SELECT NomC, RefC 
FROM client 
WHERE RefC IN 
(
    select c.refc 
    from commande c 
    join detail d on d.refcom = c.refcom 
    join produit p on p.refp = d.refp 
    where p.typep = 'clou' 
) 
AND RefC IN 
(
    select c.refc 
    from commande c 
    join detail d on d.refcom = c.refcom 
    join produit p on p.refp = d.refp 
    where p.typep = 'cheville' 
) 
AND RefC IN 
(
    select c.refc 
    from commande c 
    join detail d on d.refcom = c.refcom 
    join produit p on p.refp = d.refp 
    where p.typep = 'planche' 
); 

COUNT查詢比這個速度更快(因爲表沒有被一遍又一遍讀做),更容易閱讀和維護。

但由於是Solarflare在請求的評論提到:這些查詢不要找已經下令所有三種產品「的客戶,都下令至少一種類型的產品」,但對於客戶。