Oracle SQL查询以计数“;“儿童”;在当前查询集中

Oracle SQL查询以计数“;“儿童”;在当前查询集中,sql,oracle,subquery,children,Sql,Oracle,Subquery,Children,我在Oracle中得到了一个SQL查询,其中包含一个多级子查询,用于在数据库中生成我的网站导航。这个查询有一个多级子查询,因为对于每个用户,我必须检查他们是否有权访问导航的这一部分。结果如下所示: ID | ID_PARENT | NAME | LINK ------------------------------------------ 1 Main ~/ 2 1 Sub1 ~/Sub1 3

我在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 | 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
ID_父列引用同一表中另一行的ID列

现在,我需要的是一个查询,对于每一行,它会给我当前查询集中行的数量(因为存在其他一些用户无权访问的导航条目,我希望避免两次进行相同的子查询),这些行的当前ID为ID\u父项,因此基本上会计算子项。在上面的例子中,我需要的结果应该如下所示:

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 | 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查询,但没有一个得到我需要的结果。有人能帮我做这个吗?

你可以为你的ID\u父母分别计算()记录,然后将其与你的主查询结合起来。大概是这样的:

 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;

谢谢你的回答,但这不是我想要的。问题在于,建议中的表“YOURTABLE”不是表,而是具有多级子查询的查询。对于您的解决方案,我将不得不执行该查询两次,这是我希望避免的事情。谢谢!这正是我需要的!我有一个不同的问题,但我觉得这非常接近我需要的答案。什么允许您在此处引用同一表中的两个不同行?在“with”之前有什么东西可以理解吗?下半部分是否取决于“原始查询”是什么?具体来说,我正在尝试规范化一个表,该表不引用另一行的ID,而是复制另一行的名称。@donutguy640您最好单独问一个问题,并提供更多详细信息。您还将获得更广泛的SO用户关注。感谢您的回答,但此解决方案与etsa有相同的“问题”。