Oracle SQL 查询以计算当前查询集中的 "children"

Oracle SQL query to count "children" in current query set

我在 Oracle 中有一个 SQL 查询,其中包含一个多级子查询,用于在数据库中生成我的网站导航。这个查询有一个多级子查询,因为我必须为每个用户检查他们是否有权访问这部分导航。结果类似于以下内容:

ID | ID_PARENT | NAME    | LINK
------------------------------------------
 1               Main      ~/
 2            1  Sub1      ~/Sub1
 3            1  Sub2      ~/Sub2
 4            2  Sub1.1    ~/Sub1.1
 5            2  Sub1.2    ~/Sub1.2
 6            2  Sub1.3    ~/Sub1.3

ID_PARENT列引用同一table中另一行的ID列。

现在我需要的是一个查询,对于每一行,给我当前查询集中的行数(因为存在一些用户做的其他导航条目没有权利,并且我想避免对当前 ID 为 ID_PARENT 的同一个子查询进行两次查询),因此基本上计算 children。使用上面的示例,我需要的结果应如下所示:

ID | ID_PARENT | NAME    | LINK     | CHILDREN
---------------------------------------------------------
 1               Main      ~/                2
 2            1  Sub1      ~/Sub1            3
 3            1  Sub2      ~/Sub2            0
 4            2  Sub1.1    ~/Sub1.1          0
 5            2  Sub1.2    ~/Sub1.2          0
 6            2  Sub1.3    ~/Sub1.3          0

我已经尝试了相当多的 SQL 查询,但其中 none 得到了我需要的结果。有人可以帮我解决这个问题吗?

您可以单独计算 ID_PARENT 的记录,然后将其与您的主查询结合起来。像这样:

 SELECT A.*, COALESCE(B.RC ,0) AS CHILDREN_NUMBER
 FROM YOURTABLE A
 LEFT JOIN ( SELECT ID_PARENT,COUNT(*) AS RC FROM YOURTABLE GROUP BY ID_PARENT) B ON A.ID  = B.ID_PARENT;

输出:

ID  ID_PARENT   NAME    LINK    CHILDREN_NUMBER
1   NULL        Main    /       2
2   1           SUB1    /Sub1   3
3   1           SUB2    /Sub2   0
4   2           SUB1.1  /Sub1.1 0
5   2           SUB1.2  /Sub1.2 0
6   2           SUB1.3  /Sub1.3 0

例如

with q(ID, ID_PARENT, NAME, LINK) as (
-- original query
) 
select ID, ID_PARENT, NAME, LINK
  ,(select count(*) from q q2 where q2.ID_PARENT = q.ID) CHILDREN
from q

这样试试,这和上面etsa的回答是一样的。

     select 
     n.id,n.parent_id,n.name,n.link,coalesce(b.children,0) 
     from navigation n 
     left join (select 
                    parent_id as parent,count(id) as children 
                    from navigation group by parent_id) b 
     on n.id=b.parent;