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 与该列表进行比较并获得正确的结果。
任何指导表示赞赏。感谢您的帮助。
您可以使用 LISTAGG
和 CTE
如下:
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 BY
和 HAVING
,如下所示:
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');
我有一个 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 与该列表进行比较并获得正确的结果。
任何指导表示赞赏。感谢您的帮助。
您可以使用 LISTAGG
和 CTE
如下:
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 BY
和 HAVING
,如下所示:
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');