【问题标题】: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_id 是null。
【解决方案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;