SQL NOT IN需要双层?

时间:2011-09-23 05:11:36

标签: mysql sql

我正在编写代码来查找持久存储在MySQL数据库中的树结构,每个节点存储其父节点的ID,如果它是树的根,则为NULL。在查询它以尝试获取所有叶子节点的过程中,我注意到一些奇怪的东西。

即,此查询不会产生任何结果:

SELECT * 
FROM tree_table 
WHERE node_id NOT IN(SELECT parent_node_id FROM tree_table)

虽然这个产生了我之后的结果:

SELECT * 
FROM tree_table
WHERE node_id NOT IN(
    SELECT node_id 
    FROM tree_table 
    WHERE node_id IN(SELECT parent_node_id FROM tree_table))

似乎不是给我带来麻烦的。这是关于我错误记忆的操作或类似操作的顺序吗?

1 个答案:

答案 0 :(得分:4)

如果

SELECT parent_node_id FROM tree_table

在其结果集中返回单个NULL,然后在查询的其余部分

SELECT *   
FROM tree_table   
WHERE node_id NOT IN(SELECT parent_node_id FROM tree_table)  

不会产生任何结果。

参见NOT IN clause and NULL values(许多相关问题之一)