问题描述
假设Firebird(v.2.5)表名称TREE
有两列NODE_ID
和PARENT_NODE
。我想查询以获取NODE_ID = 1
的记录并计算一个新字段CHILD_COUNT
。
在该查询中,CHILD_COUNT
必须包含PARENT_NODE = NODE_ID
所在的记录数(在同一表中)。
我的开始查询是:
SELECT NODE_ID,PARENT_NODE,(select count(*) from TREE where PARENT_NODE = NODE_ID) as CHILD_COUNT
FROM TREE
WHERE PARENT_NODE = 1;
对于该查询,CHILD_COUNT
始终为0。如何查询所有CHILD_COUNT
表行的TREE
进程?
解决方法
-
为此要求,请在下面粘贴正确的代码
假设一个Firebird(v.2.5)表名称TREE有两列NODE_ID 和PARENT_NODE,我想进行查询以获取记录 NODE_ID = 1
SELECT NODE_ID,PARENT_NODE FROM TREE WHERE NODE_ID = 1
-
对于完整的请求,您将需要对表本身进行自我连接。
SELECT T1.Node_ID,T1.Parent_mode,T22.CHILD_COUNT FROM TREE T1,( SELECT T2.Node_ID,COUNT(*) as CHILD_COUNT FROM TREE t2 WHERE NODE_ID = 1 Group by T2.Node_ID ) as T22 WHERE T1.PARENT_NODE = T22.NODE_ID
问题出在子查询中:
where parent_node = node_id
这将搜索两个值均相等的行,而这不是您想要的:您希望其父级等于外部查询中的节点的行。为此,您需要将子查询与外部查询进行关联。因此,请在列之前加上它们所属表的别名:
select node_id,parent_node,(select count(*) from tree t1 where t1.parent_node = t.node_id) as child_count
from tree t -- ^ -- -- ^ --
where parent_node = 1;