[英]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.