Sql 从第一个左表中获取所有值,但当两个左联接使用时,会限制第一个表中的值

Sql 从第一个左表中获取所有值,但当两个左联接使用时,会限制第一个表中的值,sql,sql-server,tsql,left-join,where-clause,Sql,Sql Server,Tsql,Left Join,Where Clause,我试图从第一个左表中获取所有值,但当我使用两个左联接时,它会限制第一个表中的值 我使用了下面的查询 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 我需要person表中的所有

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

我使用了下面的查询

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

我需要person表中的所有person id。

只需将左侧联接表上的条件从联接的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_id为null。

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

 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;