2013-04-08 58 views
5

我試圖撰寫的MySQL SELECT語句從表中選擇存在什麼不表B中存在例如:選擇不表B中

表A:

+------+ 
| BAND | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
+------+ 

表B:

+------+ 
| HATE | 
+------+ 
| 1 | 
| 5 | 
+------+ 

所以,如果表A是所有頻段,而表B是我最討厭的樂隊,然後我只是想帶我不恨。所以選擇的結果應該是:

+------+ 
| BAND | 
+------+ 
| 2 | 
| 3 | 
| 4 | 
+------+ 

我該如何爲此編寫一個選擇?這是我最後一次嘗試:

SELECT * FROM A LEFT JOIN B ON A.BAND = B.HATE WHERE B.HATE IS NULL; 

編輯:上面的行已被修復!請參閱下面的註釋...「= NULL」與「IS NULL」。

+1

@Michelle您的查詢似乎是確定。你爲什麼說它不起作用? – Barranka 2013-04-08 22:57:25

+0

看到我下面的評論。對於任何具有相同問題的人,「IS NULL」與MySQL中的「= NULL」不同。我嘗試了一種方法,查詢工作,另一種方式返回一個空集。奇怪!!! – TSG 2013-04-10 18:29:31

+0

不僅在MySQL中,而且在任何SQL方言中。 SQL中的NULL值具有與任何其他值不同的屬性,包括另一個「NULL」。因此,你不能期望'= NULL'在SQL查詢上工作......你需要使用'IS NULL'。 – Barranka 2013-12-26 16:06:27

回答

16

我會用加入

select A.* 
from A left join B on A.BAND = B.HATE 
where B.HATE IS NULL; 

記住:你的表創建了合適的索引

+0

這與我嘗試的幾乎完全相同(請參閱上面的響應)。你只要求選擇陳述中的答案* ......也許這就是問題所在。 – TSG 2013-04-08 22:58:16

+0

它應該給你正確的答案! (順便說一句,我在你編輯之前發佈了這個)。這應該返回你所需要的。或者你爲什麼說它沒有返回你所需要的? – Barranka 2013-04-08 23:00:25

+0

好的 - 我發現問題了!我正在測試「B.HATE = NULL」,而不是「B.HATE IS NULL」。我上面的文本是我用來創建我的SQL命令,但是當我實際輸入代碼(到PHP字符串中)時,我將其更改爲= NULL。奇怪他們是不同的!? – TSG 2013-04-10 18:28:21

5

您可以使用IN,但它是超級低效:

SELECT * FROM tableA WHERE id NOT IN (SELECT id FROM tableB) 
+2

爲什麼這比使用連接更好? – 2013-04-08 22:48:12

+2

如果表A或B很大(對於小表,性能差別幾乎沒有),我會認爲這很慢 – Barranka 2013-04-08 22:55:17

+1

我從來沒有說過它會好一些,我實際上卻說的相反。 'IN'很糟糕,因爲它會檢查每一行的內部查詢(因此,對於'tableA'中的每一行)。 – 2013-04-08 22:57:49

0
SELECT * FROM tableA WHERE id NOT EXISTS (SELECT DISTINCT id FROM tableB) 

SELECT * FROM tableA WHERE id NOT EXISTS (SELECT id FROM tableB GROUP BY id) 
-2
SELECT BAND FROM A WHERE BAND NOT EXISTS(SELECT DISTINCT HATE FROM B) 

OR

SELECT BAND FROM A WHERE NOT EXISTS (SELECT HATE FROM B WHERE A.BAND = B.HATE); 
相關問題