我正在编写代码来查找持久存储在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))
似乎不是给我带来麻烦的。这是关于我错误记忆的操作或类似操作的顺序吗?
答案 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(许多相关问题之一)