2016-09-24 48 views
0

我正在嘗試學習SQL。我有一個表(稱爲likes),看起來像這樣:非單調SQL查詢(查找只喜歡某些東西的名字)

|---------|---------------| 
| name | color   | 
|---------|---------------| 
| Jane | Red   | 
| Talia | Red   | 
| Jane | Black   | 
| Loui | Black   | 
| John | Black   | 
| Jane | Green   | 
| John | Green   | 
|---------|---------------| 

查詢是Names who like only Black。我試着這樣說:

SELECT L1.name FROM likes L1 WHERE L1.color = 'Black' 
AND NOT EXISTS (SELECT L2.name FROM likes L2 WHERE L1.name = L2.name); 

這將返回空的,因爲最終Loui將在NOT EXISTS子查詢等於Loui。但是,我不知道該如何更改,因此只返回Loui

我可以使用UNION以及上面查詢中看到的所有內容,但沒有其他。

任何幫助,將不勝感激!

回答

2

我會group byhaving做到這一點:

select name 
from likes 
group by name 
having max(color) = min(color) and max(color) = 'Black'; 

你可以用你的方法爲好。子查詢中需要一種顏色:

SELECT L1.name 
FROM likes L1 
WHERE L1.color = 'Black' AND 
     NOT EXISTS (SELECT L2.name 
        FROM likes L2 
        WHERE L1.name = L2.name AND 
         L2.color <> 'Black' 
       ); 
+0

謝謝你,第二個查詢的偉大工程過濾器的名稱。太簡單了。我會用其他方法來做到這一點,但由於分配指令,我只能在查詢中使用哪些關鍵字。 – syy

1

您可以執行反連接。

SELECT L1.name 
FROM likes L1 
LEFT JOIN likes L2 ON (L1.name = L1.name AND L1.color != L2.color) 
WHERE L2.name IS NULL 
AND L1.color = 'Black' 

這是通過返回具有不同顏色的相同名稱的行來工作的。在沒有其他顏色的情況下,您將獲得NULL,滿足條件。

+0

謝謝,但是由於賦值指令,我不能使用其中的一些關鍵字(例如'LEFT JOIN')。 – syy

+1

@Flow告訴你的老師這是做反加入的正確方法:) –

+0

哈哈,我一定會提起它。雖然,我認爲他希望我們學習如何使用'NOT EXISTS'。謝謝你。學習了新的方法來做到這一點。 – syy

1

如果你想要的是找人誰只喜歡一個特定的顏色,你會做這樣的事情,利用分組:

SELECT name 
FROM (SELECT L1.name, MAX(L1.Color) AS color 
     FROM likes L1 
     GROUP BY L1.name 
     HAVING COUNT(*) = 1) a 
WHERE color = 'Black' 

你得到一個分組結果集人的色彩協會。然後過濾該設置,並僅返回只有一種顏色與您所選顏色關聯的人員。

1

你可以使用子查詢返回一個喜歡只有一種顏色,然後用黑色

select name fro likes 
where name in  (select name 
     FROM likes 
     Group by name 
     HAVING count(*) = 1) 
and color = 'Black' ; 
+0

謝謝,真的希望我可以使用一些每個人都發布的關鍵字。也許這會對別人有幫助。 – syy