SQL:带有连接混淆的递归
SQL: Recursion With a Join Confusion
我将首先列出我正在尝试做的事情,然后我将列出我到目前为止所做的代码。
我在 Application Express 平台上使用 Oracle PL/SQL 编写代码
我有两个表:USERS 和 LEADS。
潜在客户列:LEADID、COMPANYNAME、CONTACTNAME、OWNER
用户列:EMAIL、SUPER、ROLE
外键:
OWNER 是一个外键,指向 USERS 中的 EMAIL
SUPER 是一个外键,指向 USERS 中的 EMAIL
SUPER 是给定人员的主管。 ROLE 是他们在公司的职位
大约有5个级别。 'PEON','MGR','DIR','SRDIR','VP'
Peon 是唯一分配给他们的潜在客户的人。
我正在尝试生成一份报告,其中 returns 行包含以下内容
下属,NUMLEADS
下属是使用该应用程序的用户的直属人员。我有代码
select U.EMAIL as Subordinate
from USERS U
WHERE lower(v('APP_USER')) = U.SUPER
Numleads是下属组织下peon创建的所有leads。我目前有代码可以列出当前用户下的peon数量
select count(*)
from USERS U2
where U2.ROLE = 'PEON'
start with lower(v('APP_USER')) = U2.EMAIL
connect by NOCYCLE prior U2.email = U2.super
我参与其中,但我对如何在递归序列中引用查询结果感到困惑。我知道我需要查询当前用户下属下的所有 PEONS,将他们与他们关联的所有线索进行 JOIN,然后统计线索数量。但我不确定如何在 SQL.
中订购
非常感谢您的帮助
编辑:感谢 JBrooks
select U.EMAIL as Sub, count(*) as CreatedAllTime
from USERS U
left join USERS UPEON
on UPEON.EMAIL in
(
select UPEON2.EMAIL
from USERS UPEON2
where UPEON2.ROLE = 'PEON'
start with U.EMAIL = UPEON2.EMAIL
connect by NOCYCLE prior UPEON2.email = UPEON2.super
)
left join LEADS L
on UPEON.EMAIL = L.OWNER
where U.EMAIL in
(
select U2.EMAIL as Sub
from USERS U2
WHERE lower(v('APP_USER')) = U2.SUPER
)
group by U.EMAIL
select U2.Email as Subordinate,
count(*) as NumLeads
from USERS U2
left join LEADS l
on U2.Email = l.Owner
where U2.ROLE = 'PEON'
and lower(v('APP_USER')) in
(select EMAIL
from USERS S
START WITH lower(v('APP_USER')) = lower(S.SUPPER)
CONNECT BY PRIOR EMAIL = SUPPER)
group by U2.Email
order by U2.Email
我将首先列出我正在尝试做的事情,然后我将列出我到目前为止所做的代码。
我在 Application Express 平台上使用 Oracle PL/SQL 编写代码
我有两个表:USERS 和 LEADS。
潜在客户列:LEADID、COMPANYNAME、CONTACTNAME、OWNER
用户列:EMAIL、SUPER、ROLE
外键:
OWNER 是一个外键,指向 USERS 中的 EMAIL
SUPER 是一个外键,指向 USERS 中的 EMAIL
SUPER 是给定人员的主管。 ROLE 是他们在公司的职位
大约有5个级别。 'PEON','MGR','DIR','SRDIR','VP'
Peon 是唯一分配给他们的潜在客户的人。
我正在尝试生成一份报告,其中 returns 行包含以下内容 下属,NUMLEADS
下属是使用该应用程序的用户的直属人员。我有代码
select U.EMAIL as Subordinate
from USERS U
WHERE lower(v('APP_USER')) = U.SUPER
Numleads是下属组织下peon创建的所有leads。我目前有代码可以列出当前用户下的peon数量
select count(*)
from USERS U2
where U2.ROLE = 'PEON'
start with lower(v('APP_USER')) = U2.EMAIL
connect by NOCYCLE prior U2.email = U2.super
我参与其中,但我对如何在递归序列中引用查询结果感到困惑。我知道我需要查询当前用户下属下的所有 PEONS,将他们与他们关联的所有线索进行 JOIN,然后统计线索数量。但我不确定如何在 SQL.
中订购非常感谢您的帮助
编辑:感谢 JBrooks
select U.EMAIL as Sub, count(*) as CreatedAllTime
from USERS U
left join USERS UPEON
on UPEON.EMAIL in
(
select UPEON2.EMAIL
from USERS UPEON2
where UPEON2.ROLE = 'PEON'
start with U.EMAIL = UPEON2.EMAIL
connect by NOCYCLE prior UPEON2.email = UPEON2.super
)
left join LEADS L
on UPEON.EMAIL = L.OWNER
where U.EMAIL in
(
select U2.EMAIL as Sub
from USERS U2
WHERE lower(v('APP_USER')) = U2.SUPER
)
group by U.EMAIL
select U2.Email as Subordinate,
count(*) as NumLeads
from USERS U2
left join LEADS l
on U2.Email = l.Owner
where U2.ROLE = 'PEON'
and lower(v('APP_USER')) in
(select EMAIL
from USERS S
START WITH lower(v('APP_USER')) = lower(S.SUPPER)
CONNECT BY PRIOR EMAIL = SUPPER)
group by U2.Email
order by U2.Email