Select 在 select 中计算新字段

Select in select to compute a new field

假设 Firebird (v.2.5) Table 名称 TREE 有两列 NODE_IDPARENT_NODE。我想查询以获取 NODE_ID = 1 的记录并计算一个新字段 CHILD_COUNT.

在该查询中,CHILD_COUNT 必须包含记录数(在同一个 table 中),其中 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。我如何执行此查询才能为所有 TREE table 行获取 CHILD_COUNT 进程?

  1. 对于这个需求,下面粘贴正确的代码

    Suppose a Firebird (v.2.5) Table name TREE have two columns NODE_ID and PARENT_NODE, I would like to make query to get records with NODE_ID = 1

    SELECT NODE_ID, PARENT_NODE
    FROM TREE
    WHERE NODE_ID = 1
    
  2. 对于完整的请求,您需要对 table 本身进行自连接。

    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

这会搜索两个值都相等的行,这不是您想要的:您想要父级等于外部查询 中的节点的行。为此,您需要关联 子查询与外部查询。因此,在列前加上它们所属的 table 的别名:

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;