2012-02-18 113 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