ПРИСОЕДИНЯЙТЕСЬ к одной и той же таблице дважды и выберите пару - PullRequest
0 голосов
/ 01 мая 2019

У меня есть 2 таблицы:

staff (enum,ename,title)
101,Zhivago,Doctor
102,Welby,Doctor
103,Jekyl,Doctor
104,Caligari,Doctor
105,Nightingale,Nurse
106,Ratchet,Nurse

и

expertise (enum,code)
101,4001
101,4002
101,4003
101,4004
101,4005
101,4006
102,4002
102,4003
102,4006
103,4001
103,4006
103,4004
104,4004
104,4006
105,4002
105,4003
105,4004
105,4006
106,4001
106,4002
106,4003
106,4004
106,4005
106,4006

Как получить пары доктора и медсестры (enum, ename, title; enum, ename, title), которыеподелитесь хотя бы одним опытом.

Также пары доктора и медсестры (enum, ename, title; enum, ename, title) с точно такими же экспертными знаниями.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Я верю, что этот SQL получит желаемые результаты:

Часть 1: Как получить пары доктора и медсестры (enum, ename, title; enum, ename, title), которые имеют хотя бы один опыт.

Объяснение: выберите всех врачей, подходящих для медсестер по любому опыту; Отфильтровать до отличных результатов.

SELECT DISTINCT
    s1.enum as doctor_enum,
    s1.ename as doctor_ename,
    s1.title as doctor_title,
    s2.enum as nurse_enum,
    s2.ename as nurse_ename,
    s2.title as nurse_title
  from staff as s1
  inner join expertise as e1 on e1.enum = s1.enum
  inner join expertise as e2 on e2.code = e1.code
  inner join staff as s2 on s2.enum = e2.enum
  where s1.title = 'Doctor'
    and s2.title = 'Nurse';

Результаты части 1:

doctor_enum doctor_ename    doctor_title    nurse_enum  nurse_ename nurse_title
101 Zhivago Doctor  105 Nightingale Nurse
102 Welby   Doctor  105 Nightingale Nurse
103 Jekyl   Doctor  105 Nightingale Nurse
101 Zhivago Doctor  106 Ratchet Nurse
103 Jekyl   Doctor  106 Ratchet Nurse
102 Welby   Doctor  106 Ratchet Nurse
104 Caligari    Doctor  105 Nightingale Nurse
104 Caligari    Doctor  106 Ratchet Nurse

Часть 2: Также пары доктора и медсестры (enum, ename, title; enum, ename, title) с точно такими же знаниями.

Объяснение: выберите то же, что и выше, но проверьте, не соответствуют ли какие-либо из экспертных знаний врача медсестре, и наоборот.

SELECT DISTINCT
    s1.enum as doctor_enum,
    s1.ename as doctor_ename,
    s1.title as doctor_title,
    s2.enum as nurse_enum,
    s2.ename as nurse_ename,
    s2.title as nurse_title
  from staff as s1
  inner join expertise as e1 on e1.enum = s1.enum
  inner join expertise as e2 on e2.code = e1.code
  inner join staff as s2 on s2.enum = e2.enum
  where s1.title = 'Doctor'
    and s2.title = 'Nurse'
    and not exists (
          SELECT *
            FROM expertise e1
            WHERE e1.enum = s1.enum
              AND e1.code NOT IN (
                    SELECT code FROM expertise e2 WHERE e2.enum = s2.enum
              )
     )
    and not exists (
          SELECT *
            FROM expertise e2
            WHERE e2.enum = s2.enum
              AND e2.code NOT IN (
                    SELECT code FROM expertise e1 WHERE e1.enum = s1.enum
              )
     );

Результаты части 2:

doctor_enum doctor_ename    doctor_title    nurse_enum  nurse_ename nurse_title
101 Zhivago Doctor  106 Ratchet Nurse

Вот сценарий схемы для тех, кто использует этот ответ в будущем:

CREATE TABLE staff (
    `enum` int,
    `ename` nvarchar(50),
    `title` nvarchar(50)
);

 INSERT INTO staff VALUES
   (101,'Zhivago','Doctor'), 
   (102,'Welby','Doctor'), 
   (103,'Jekyl','Doctor'), 
   (104,'Caligari','Doctor'), 
   (105,'Nightingale','Nurse'), 
   (106,'Ratchet','Nurse');

CREATE TABLE expertise (
   `enum` int,
   `code` int
);

INSERT INTO expertise VALUES
  (101,4001),
  (101,4002),
  (101,4003),
  (101,4004),
  (101,4005),
  (101,4006),
  (102,4002),
  (102,4003),
  (102,4006),
  (103,4001),
  (103,4006),
  (103,4004),
  (104,4004),
  (104,4006),
  (105,4002),
  (105,4003),
  (105,4004),
  (105,4006),
  (106,4001),
  (106,4002),
  (106,4003),
  (106,4004),
  (106,4005),
  (106,4006);

Надеюсь, это поможет.

0 голосов
/ 01 мая 2019

Вы можете использовать listagg() оконную аналитическую функцию вместе с self-join для таблицы опыта и оставлять пары только с помощью having предложения

select listagg(e.enum||','||s.ename||','||s.title,';') 
        within group (order by e.enum) as "Grouped Results"
  from staff s
  join expertise e 
    on e.enum = s.enum
  join expertise e2 
    on e2.enum = s.enum and e2.code = e.code
 group by e.code
 having count(1)>1

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...