Подзапрос Oracle SQL соответствует нескольким строкам

У меня есть таблица Oracle (PeopleSoft) с идентификаторами сотрудников и должностными обязанностями, которые могут выполнять сотрудники.

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 должен возвращать только сотрудника 05, так как они также могут выполнять только задания JobA и JobC. У сотрудника 03 есть дополнительные навыки (JobF), поэтому их не следует включать в результаты.

Я предполагаю, что мне понадобится подзапрос, чтобы получить список заданий, которые я хочу... что-то вроде

Select job 
From table where id = '02'

Но я не уверен, как сравнить каждый уникальный идентификатор сотрудника с этим списком и получить правильные результаты.

Любое руководство приветствуется. Спасибо за вашу помощь.


person Chris Bombeck    schedule 24.06.2020    source источник
comment
каков ваш ожидаемый результат?   -  person zealous    schedule 24.06.2020
comment
Список совпадающих идентификаторов сотрудников... так что в примере только одна строка = '05'   -  person Chris Bombeck    schedule 24.06.2020


Ответы (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');
person Popeye    schedule 24.06.2020
comment
Спасибо! Я пошел со вторым, и он, кажется, работает. - person Chris Bombeck; 24.06.2020