列出所有带休假标题的员工,并在sql join中保留申请

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列出所有带休假标题的员工,并在sql join中保留申请相关的知识,希望对你有一定的参考价值。

我有三张桌子:

表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_Setleave_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_titlenod是否适用leave_set

答案

我想你想要cross joinleave_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

另一答案

我认为员工可以多次采用相同的休假类型。

如果是这样,您可能真的需要聚合查询:

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;
另一答案

enter image description here

选择em.emp_id,lt.leave_title,ls.nod from leave_type lt cross join employee em left join leave_set ls on ls.leave_type_id = lt.leave_type_id

以上是关于列出所有带休假标题的员工,并在sql join中保留申请的主要内容,如果未能解决你的问题,请参考以下文章

字节跳动公司有没有年休假?

TFS 从 2008 年升级到 2012 年 - 更改已签出,但员工休假

如何将不符合WHERE条件的联接表中的数据包含为空值(SQL)

sql 拉动所有高地医院员工的硕士学位,其中主要(列出)是某种形式的教育。所有高地员工都有

根据登录的用户查看休假详细信息

02Hive数据仓库——SQL员工练习题