Перечислите всех сотрудников с оставленным названием и оставьте заявку в sql join - PullRequest
0 голосов
/ 20 апреля 2019

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

Таблица 1: сотрудник #

emp_id -KEY    emp_name    emp_join_date
 1841           test       2016-04-01
 1842           test1      2019-04-01

Таблица 2: Leave_Set #

emp_id-KEY    start_date    end_date    nod    leave_type_id
 1841         2019-04-01    2019-04-02   2         2

Таблица 3: Leave_TYPE #

leave_type_id-KEY    leave_title
    1                   AL
    2                   SL
    3                   CME

Я попробовал левое соединение, но если leave_set не имеет значений, он возвращает нулевые значения в Leave_Set и leave_type.

   SELECT 
       O.emp_id,  
       P.leave_title, I.leave_type_id, I.nod
   FROM 
       employee O 
   LEFT JOIN 
       leave_set I ON O.emp_id = I.emp_id and o.emp_id=1841
   LEFT OUTER JOIN 
       leave_type P ON P.leave_type_id = I.leave_type_id 

Мой вывод выглядит так:

   emp_id   leave_title       nod
   1841         NULL          NULL
   1879         NULL          NULL

Мне нужен вывод, как показано ниже:

      emp_id   Leave_title  nod

       1841       AL          -
       1841       SL          2
       1841       CME         -
       1842       AL          -
       1842       SL          -
       1842       CME         -

Мне нужен каждый сотрудник со всеми leave_title с nod независимо от того, применяются ли они leave_set.

Ответы [ 3 ]

1 голос
/ 20 апреля 2019

Я полагаю, что сотрудники могут использовать один и тот же тип отпуска несколько раз.

Если это так, вы действительно можете запросить агрегирование:

select e.emp_id, lt.leave_title, 
       sum(ls.nod) as nod
from employee e cross join
     leave_type lt left join
     leave_set ls
     on ls.emp_id = e.emp_id and
        ls.leave_type_id = lt.leave_type_id
group by e.emp_id, lt.leave_title
order by e.emp_id, lt.leave_title;
1 голос
/ 20 апреля 2019

Я думаю, что вы хотите cross join с leave_type, потому что вы хотите все комбинации.Затем следует left join фактической записи об отпуске, например,

select O.emp_id, P.leave_title, I.leave_type_id, I.nod
from employee O 
cross join leave_type P 
left join leave_set I ON O.emp_id = I.emp_id and I.leave_type_id = P.leave_type_id
where o.emp_id = 1841

PS: Обычно вы ограничиваетесь указанным сотрудником в пункте where, а не join.

0 голосов
/ 20 апреля 2019

введите описание изображения здесь

выберите em.emp_id, lt.leave_title, ls.nod из имениволочного типа lt сотрудника перекрестного объединения, оставившего соединение с левым_сессией ls на ls.leave_type_id = lt.leave_type_id

...