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】:

您可以使用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');

【讨论】:

谢谢!我选择了第二个,它似乎正在工作。

以上是关于Oracle SQL 子查询——匹配多行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle-查询,,..

oracle子查询问题,急急急!

sql怎么用查询结果作为条件进行查询

oracle子查询

oracle sql语言模糊查询

Oracle 单行子查询在使用嵌套子查询时返回多行