Я верю, что этот 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);
Надеюсь, это поможет.