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;
我在 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;