Как собрать таблицу из 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
→ Ссылка