BST节点类型识别SQL查询报错:子查询返回多行值求排查
解决BST节点类型查询中的“子查询返回多行”错误
问题类型判定
这是逻辑错误,核心问题是你在CASE语句中错误使用了返回多行结果的子查询,不符合SQL中表达式只能接收单值的要求。
错误原因分析
你原查询中的(SELECT Node FROM BST)和(SELECT Parent FROM BST)会返回整个表的所有Node/Parent值(多行数据),但NOT IN左侧需要的是当前行的单个Node值,数据库无法将集合与集合做这种单值比较逻辑,因此抛出错误。
修正后的查询语句
SELECT Node, CASE WHEN Parent IS NULL THEN 'Root' WHEN Node NOT IN (SELECT Parent FROM BST WHERE Parent IS NOT NULL) THEN 'Leaf' ELSE 'Inner' END AS NodeType FROM BST ORDER BY Node;
代码说明
- Root节点:直接判断
Parent IS NULL,与原逻辑一致。 - Leaf节点:当前Node不在所有非空Parent的集合中,说明该节点没有子节点,属于叶子节点。
- Inner节点:排除Root和Leaf的节点,自然就是存在子节点的内部节点。
验证结果
执行修正后的语句会得到你预期的结果:
1 Leaf 2 Inner 3 Leaf 5 Root 6 Leaf 8 Inner 9 Leaf
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

