Как собрать таблицу из 4 таблиц?
courses crs | act_learnings al | learnings ls | collaborators cls
-------------|-----------------------|---------------------|-----------------
id | person_id | person_id | id
code | course_id | course_id | hire_date
| | |
Помогите разобраться с запросом к 4 таблицам:
- courses - курсы
- act_learnings - назначенные курсы
- learnings - завершенные курсы
- collaborators - сотрудники
Задача вывесть сотрудников, которые работают уже 14 дней WHERE cls.hire_date < DATEADD(day, -14, getdate())
Но которые НЕ проходили курс с кодом "xxx". Т.е. НЕ должно быть в таблицах al и ls сотрудников, у которых al.course_id = crs.id и ls.course_id = crs.id
Проблема заключается еще и в том, что в таблицах al и ls нет кода курса.
Ответы (1 шт):
Автор решения: Akina
→ Ссылка
Вроде бы так:
SELECT cls.*
FROM collaborators cls
LEFT JOIN ( learnings ls
INNER JOIN courses crs1 ON crs1.id = ls.course_id
AND crs1.code = 'xxx' ) ON cls.id = ls.person_id
LEFT JOIN ( act_learnings al
INNER JOIN courses crs2 ON crs2.id = al.course_id
AND crs2.code = 'xxx' ) ON cls.id = al.person_id
WHERE cls.hire_date < CURRENT_DATE - INTERVAL 14 DAY
AND COALESCE(ls.course_id, al.course_id) IS NULL