【问题标题】:List all employee with leave title, and leave apply in join列出所有具有休假职称的员工,并在加入中申请休假
【发布时间】:2019-09-10 06:15:15
【问题描述】:

我有三张桌子:

表 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

【问题讨论】:

  • @DaleBurrell 示例数据已更新..
  • @Dolubolu 问题是如果 Leave_Set 没有一行,那么你就无法获得 nod 或 leave_title 因为该表用于连接 3 个表。

标签: sql sql-server join inner-join outer-join


【解决方案1】:

我认为您想要 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

【讨论】:

    【解决方案2】:

    我认为员工可以多次休同一种休假。

    如果是这样,你可能真的想要一个聚合查询:

    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;
    

    【讨论】:

      【解决方案3】:

      enter image description here

      select 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-23
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        相关资源
        最近更新 更多