簡體   English   中英

Oracle SQL 中的多列分層查詢

[英]Multi column hierarchical query in Oracle SQL

我有一個分配表,其中包含具有員工 ID 和項目 ID 的員工,主鍵作為分配 ID。 一個項目可以有多個員工,一個員工可以在多個項目中。 給定一個員工 id,需要以遞歸方式獲取包含與該員工相關的所有項目的分配 id 以及這些項目的所有員工的結果集。 這如何在 sql(preferred) 或 plsql 中實現? 我正在使用 Oracle SQL。

桌子

assignment_id 員工ID 項目編號
1000 2000 3000
1001 2001年 3000
1002 2000 3001
1003 2002年 3001
1004 2002年 3002
1005 2003年 3002
1007 2004年 3002
1008 2005年 3002
1009 2009 3004

例如:給定 2000,將返回以下結果集

assignment_id 員工ID 項目編號
1000 2000 3000
1001 2001年 3000
1002 2000 3001
1003 2002年 3001
1004 2002年 3002
1005 2003年 3002
1007 2004年 3002
1008 2005年 3002

下面的查詢運行循環導致復雜層次結構的巨大結果集。 使用 connect by 的類似問題。

with all_subs(assignment_id, employee_id, project_id) as 
(
    select assignment_id, employee_id, project_id
    from csm_assignments
    and employee_id = 70001
    union all
    select s.assignment_id, s.employee_id, s.project_id
    from csm_assignments s, all_subs s1
    and (
        (s.employee_id = s1.employee_id and s.project_id != s1.project_id) OR
        (s.employee_id != s1.employee_id and s.project_id = s1.project_id)
    )
) cycle assignment_id set is_loop to 'Y' default 'N'
select * 
from csm_assignments
where assignment_id in (select assignment_id from all_subs);

與該員工相關的所有項目的分配 ID:

WITH emp_proj as (
    SELECT project_id
    FROM csm_assignments
    WHERE employee_id = 70001
)
SELECT ca.assignment_id
FROM csm_assignments ca
INNER JOIN emp_proj ep on ca.project_id = ep.project_id

這些項目的所有員工:

WITH emp_proj as (
    SELECT project_id
    FROM csm_assignments
    WHERE employee_id = 70001
)
SELECT DISTINCT ca.employee_id
FROM csm_assignments ca
INNER JOIN emp_proj ep on ca.project_id = ep.project_id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM