我是新來編寫SQL查詢和我陷入一些簡單的人,我需要找到drinkers who only like bud
非單調SQL查詢
對於第一種:
SELECT drinker
FROM likes
WHERE beer = 'Bud';
喜歡(飲酒,啤酒)
我知道上面的查詢會返回每個喜歡花蕾的飲酒者,我無法過渡到每個飲者,只有只有喜歡芽。
我是新來編寫SQL查詢和我陷入一些簡單的人,我需要找到drinkers who only like bud
非單調SQL查詢
對於第一種:
SELECT drinker
FROM likes
WHERE beer = 'Bud';
喜歡(飲酒,啤酒)
我知道上面的查詢會返回每個喜歡花蕾的飲酒者,我無法過渡到每個飲者,只有只有喜歡芽。
有很多方法可以解決這個問題。我更喜歡使用與子查詢的一個,因爲在這種情況下,子查詢不拉的實際數據,因此它是快速:
SELECT drinker
FROM likes l1
WHERE beer = 'Bud'
AND NOT EXISTS (SELECT 1 FROM likes l2 WHERE l2.drinker=l1.drinker and l2.beer <> "Bud");
什麼它幾乎做的是,它會選擇那些飲酒者,像芽和TGEN檢查如果那些喜歡別的。如果沒有記錄與子查詢中的條件匹配,則not exists
返回true。
爲了您的飲酒者,只有像花蕾:
SELECT a.DRINKER
FROM (SELECT DRINKER
FROM LIKES
WHERE BEER = 'BUD') a
INNER JOIN (SELECT DRINKER, COUNT(*)
FROM LIKES
GROUP BY DRINKER
HAVING COUNT(*) = 1) b
ON b.DRINKER = a.DRINKER
第一子查詢(a)爲您的查詢其拉回到大家誰喜歡芽。第二個子查詢(b)返回所有隻喜歡一件事的飲酒者。加入他們會讓你只喜歡Bud的飲酒者。
祝你好運。
另一種解決方案訪問表只有一次,如果這兩個最小值和最大值是相同的,只有一個值:
SELECT drinker
FROM likes
GROUP BY drinker
HAVING MIN(beer) = 'Bud'
AND MAX(beer) = 'Bud';
你不應該問2個不同的問題,在一個職位。有可能第一個問題的答案非常好,但第二個問題的答案並不好,另一個問題反過來也是如此。 – Shadow
@Shadow編輯後 – bkennedy
你只需要確定'HAVING'只有1個喜歡 – Serpiton