Oracle SQL 子查询 -- 匹配多行

Oracle SQL Subquery -- match multiple rows

我有一个 Oracle (PeopleSoft) table,其中包含员工 ID 和员工能够履行的工作职责。

id | job
------------
01 | JobA
01 | JobB
01 | JobC
02 | JobA
02 | JobC
03 | JobA
03 | JobC
03 | JobF
04 | JobH
04 | JobC
05 | JobA
05 | JobC

此列表中只有大约 1000 名不同的员工

如何使用 SQL 找到与员工 02 具有完全相同技能的员工?

员工 02 可以做 JobA 和 JobC - SQL 应该只能 return 员工 05,因为他们也只能做 JobA 和 JobC。员工 03 有额外的技能 (JobF),因此他们不应包含在结果中。

我假设我需要一个子查询来获取我想要的工作列表...类似

Select job 
From table where id = '02'

但我不确定如何将每个唯一的员工 ID 与该列表进行比较并获得正确的结果。

任何指导表示赞赏。感谢您的帮助。

您可以使用 LISTAGGCTE 如下:

WITH CTE AS 
(SELECT ID, JOB,
        LISTAGG(JOB, ',') WITHIN GROUP (ORDER BY JOB) OVER (PARTITION BY ID) JOBS
   FROM YOUR_TABLE)
SELECT C1.ID, C1.JOB 
  FROM CTE C1 JOIN CTE C2
    ON C1.JOBS = C2.JOBS
 WHERE C1.ID <> '02' AND C2.ID = '02';

或者您可以使用 GROUP BYHAVING,如下所示:

SELECT C1.ID
  FROM CTE C1
 WHERE C1.ID <> '02'
GROUP BY C1.ID
HAVING LISTAGG(C1.JOB, ',') WITHIN GROUP (ORDER BY C1.JOB) =
(SELECT LISTAGG(C2.JOB, ',') WITHIN GROUP (ORDER BY C2.JOB)
   FROM CTE C2
  WHERE C2.ID = '02');