2012-07-21 77 views
1

我有一些(My)SQL查詢的問題。在我的數據庫中,我有兩個表。一個叫做kfz_typen,另一個叫做kfz_temp2。我需要獲取kfz_temp2表的所有條目,其中ktyp(只是一個整數字段)不在kfz_typen表中。爲什麼這個SQL查詢不適合我?

SELECT * FROM kfz_temp2 
WHERE kfz_temp2.KType NOT IN (SELECT DISTINCT kfz_typen.ktyp FROM kfz_typen) 

在我看來,上面這個查詢應該完全是我想要的。但它不!我只是從我的MySQL服務器得到一個空的結果。

如果查詢中沒有「NOT」,我會得到兩個表中的條目,所以匹配確實有效。

那麼上面的查詢有什麼問題?

+0

什麼'從kfz_typen'選擇不同的kfz_typen.ktyp自己返回? – Simon 2012-07-21 11:11:31

+0

@Simon:它返回它所要的,http://nopaste.info/644154e4a4.html – 2012-07-21 12:19:12

+0

@DimitriR .:必須別的。請參見[here](http://sqlfiddle.com/#!2/4365d/1) – 2012-07-21 12:48:24

回答

2

這項工作?可能需要對結果進行分組。

我不確定爲什麼第一個查詢不起作用,但我相信這是做同樣的事情。

+0

我同意,因爲這個左連接將返回所有kfz_typen元組,即使是與kfz_temp2無關的元組(在kfz_typen.ktyp中標記爲NULL)。 – davidbuzatto 2012-07-21 15:45:05

+0

是的,那爲我工作,thx。但我仍然不明白,爲什麼我的第一個查詢不起作用。 – 2012-07-21 16:19:24

+0

如果在kfz_typen.ktyp列中存在(即使是一個)NULL,則第一個查詢(帶有NOT IN)將產生零行。編寫這種類型的查詢(反半導體)的(語義上)正確的方法是使用'NOT EXISTS'或'LEFT JOIN/IS NULL'(就像這個答案一樣)。 – 2013-04-21 18:11:34

-2

刪除不同然後我希望它對你有幫助。

+0

由於重複項不會影響IN運算符,因此刪除DISTINCT關鍵字將不起作用。 – 2012-07-21 12:41:14