2016-09-25 65 views
0

我是新來編寫SQL查詢和我陷入一些簡單的人,我需要找到drinkers who only like bud非單調SQL查詢

對於第一種:

SELECT drinker 
FROM likes 
WHERE beer = 'Bud'; 

喜歡(飲酒,啤酒)

我知道上面的查詢會返回每個喜歡花蕾的飲酒者,我無法過渡到每個飲者,只有只有喜歡芽。

+2

你不應該問2個不同的問題,在一個職位。有可能第一個問題的答案非常好,但第二個問題的答案並不好,另一個問題反過來也是如此。 – Shadow

+0

@Shadow編輯後 – bkennedy

+0

你只需要確定'HAVING'只有1個喜歡 – Serpiton

回答

1

有很多方法可以解決這個問題。我更喜歡使用與​​子查詢的一個,因爲在這種情況下,子查詢不拉的實際數據,因此它是快速:

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。

+0

它據說生成最好的'explain'計劃 – Drew

+0

@shadow'SELECT 1'做了什麼?我從來沒有遇到這個 – bkennedy

+1

我提供了鏈接到文檔。它在那裏解釋。 – Shadow

1

爲了您的飲酒者,只有像花蕾:

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的飲酒者。

祝你好運。

+0

COUNT(*)'做什麼?我的邏輯是找到那些喜歡芽和COUNT(啤酒)= 1但不知道如何結合它的人。另外我不相信我已經被教過'INNER JOIN'或'ON'命令,還有其他方法可以做到這一點嗎? – bkennedy

+0

http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions032.htm#i82697 –

+0

不需要嵌套子查詢。獲得count(*)子查詢,然後將其加回到喜歡的表中,並在外部查詢中使用where條件。 – Shadow

1

另一種解決方案訪問表只有一次,如果這兩個最小值和最大值是相同的,只有一個值:

SELECT drinker 
FROM likes 
GROUP BY drinker 
HAVING MIN(beer) = 'Bud' 
    AND MAX(beer) = 'Bud'; 
+0

我喜歡這個解決方案的創意。那麼,MIN(啤酒)='Bud'AND MAX(啤酒)='Bud'這兩行是如何工作的?我不是很瞭解min(啤酒)= bud或max(啤酒)= bud。儘管它確實給我提供了正確的數據 – bkennedy

+0

@bkennedy:由於在聚集之後評估HAVING,所以除了'Bud'之外,不能有任何其他值。您可以將最小/最大值添加到選擇列表並運行查詢,而無需查看基礎數據。 – dnoeth