Oracle SQL 子查询——匹配多行
Posted
技术标签:
【中文标题】Oracle SQL 子查询——匹配多行【英文标题】:Oracle SQL Subquery -- match multiple rows 【发布时间】:2020-06-24 04:50:07 【问题描述】:我有一个 Oracle (PeopleSoft) 表,其中包含员工 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,我如何找到与 Employee 02 具有完全相同技能的员工?
员工 02 可以执行 JobA 和 JobC - SQL 应该只返回员工 05,因为他们也只能执行 JobA 和 JobC。员工 03 具有额外技能 (JobF),因此不应将其包含在结果中。
我假设我需要一个子查询来获取我想要的工作列表......类似于
Select job
From table where id = '02'
但我不确定如何将每个唯一的员工 ID 与该列表进行比较并获得正确的结果。
感谢任何指导。感谢您的帮助。
【问题讨论】:
你的预期输出是什么? 匹配的员工 ID 列表...所以在示例中只有一行 = '05' 【参考方案1】:您可以使用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 SQL 子查询——匹配多行的主要内容,如果未能解决你的问题,请参考以下文章