选择以选择以计算新字段

问题描述

假设Firebird(v.2.5)表名称TREE有两列NODE_IDPARENT_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进程?

解决方法

  1. 为此要求,请在下面粘贴正确的代码

    假设一个Firebird(v.2.5)表名称TREE有两列NODE_ID 和PARENT_NODE,我想进行查询以获取记录 NODE_ID = 1

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

    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;