2012-02-18 107 views
3

我有一張三列表:taxon_idscientific_name_element_idparent_id。我想找到那些是孩子而不是父母的元素,所以它是結構的終點。MySQL「NOT IN」查詢不起作用

我發現一些消息來源說建議我用

select taxon_id 
     from taxon_name_element 
     where taxon_id not in 
          (select parent_id from taxon_name_element) 

但是,這並不工作,我得到一個空集的時候其實我可以瀏覽條目,看看有,例如,一個taxon_id=1,和NO parent_id=1

相反,當我看到taxon_id的是PARENT_ID的,我得到一個非空的結果集

我在做什麼錯?我怎樣才能解決這個問題?

+1

可能重複[SQL NOT IN的約束和NULL值(http://stackoverflow.com/questions/129077/sql-not-in -constraint-and-null-values) – ruakh 2012-02-18 18:20:19

+0

感謝ruakh,我添加了一個不是null的要求,它的工作。我的理解是否正確?:如果taxon_id與NULL比較,它會返回未知和未知添加到任何數字將產生未知,因此結果是沒有行?感謝linkk – SimaPro 2012-02-18 18:50:22

+1

是的,確切地說。像'3 <> NULL'是不確定的,因爲'NULL'可能是一個三;所以也是'3 NOT IN(1,2,NULL)'。 MySQL將只返回已知*的行以滿足WHERE條款。 – ruakh 2012-02-18 18:53:07

回答

6

taxon_name_element.parent_id是否有NULL?

查詢...

select taxon_id 
from taxon_name_element 
where taxon_id not in (
    select parent_id 
    from taxon_name_element 
) 

...等價於...

select taxon_id 
from taxon_name_element 
where 
    taxon_id <> parent_id_1 
    AND taxon_id <> parent_id_2 
    ... 
    AND taxon_id <> parent_id_N 

...其中parent_id_X是目前在parent_id列的實際值。如果即使其中一個爲NULL,相應的taxon_id <> parent_id_X表達式也會「崩潰」爲NULL,並用它拖動整個WHERE表達式。

篩選出空值來獲得你想要的東西:

select taxon_id 
from taxon_name_element 
where taxon_id not in (
    select parent_id 
    from taxon_name_element 
    where parent_id is not null 
) 
2

假設PARENT_ID柱是NULL(意味着沒有值被設定)

要選擇所有scientific_name_element_id不具有值爲PARENT_ID(意味着PARENT_ID是NULL)

你這樣做:

SELECT scientific_name_element_id 
FROM YOUR_TABLE 
WHERE parent_id IS NULL 

這會給你一個沒有父母的scientific_name_element_id列表。

+0

我想你一定誤解了這個問題。您的查詢將查找沒有* parent *的記錄。 OP想找到沒有*孩子*的記錄。 (順便說一下,表的名字是'taxon_name_element'。) – ruakh 2012-02-18 18:34:23