【问题标题】:Get all the values from the first left table but when two left joins used its restricting the values from first table从第一个左表中获取所有值,但是当两个左连接使用它限制第一个表中的值时
【发布时间】:2020-09-17 19:13:51
【问题描述】:

我试图从第一个左表中获取所有值,但是当我使用两个左连接时,它会限制第一个表中的值。

我使用了下面的查询

SELECT P.person_id, TS.Task_Id, TS.skill 
FROM Person P 
LEFT JOIN Person_Skill PS ON P.person_id = PS.person_id 
LEFT JOIN Task_Skill TS ON PS.Skill = TS.Skill 
WHERE ts.task_id = 245

我需要人员表中的所有人员 ID。

【问题讨论】:

    标签: sql sql-server tsql left-join where-clause


    【解决方案1】:

    只需将左连接表上的条件从where 子句移动到连接的on 子句即可:

    select p.person_id, ts.task_id, ts.skill 
    from person p 
    left join person_skill ps 
        on p.person_id = ps.person_id 
    left join task_skill ts 
        on  ps.skill = ts.skill 
        and ts.task_id = 245       --> here
    

    基本原理:where 子句中的条件是强制性的。如果ts 中没有匹配,则条件ts.task_id = 245 不能满足,因为ts.task_idnull

    【讨论】:

      【解决方案2】:

      在子查询中使用过滤条件,而不是将其用作外部的全局过滤器。这应该会给你你想要的输出。

       SELECT P.person_id,TS.Task_Id,TS.skill FROM Person P 
       LEFT JOIN Person_Skill PS 
       ON P.person_id=PS.person_id 
       LEFT JOIN 
       (Select * from Task_Skill where task_id = 245) TS 
       ON PS.Skill=TS.Skill;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 2019-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 2021-04-28
        相关资源
        最近更新 更多