Oracle SQL查询以计数“;“儿童”;在当前查询集中
我在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
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有相同的“问题”。