左连接差异:省略行
在此查询中,表 #appSteps 和 #appProgress 之间的 LEFT JOIN 出现故障,导致从结果集中排除预期行。
查询问题中:
select p.appId, s.stepId, s.section, p.start from #appSteps s with (nolock) left join #appProgress p on s.stepId = p.stepId where s.section is not null and p.appId = 101
预期结果:
appId | stepId | section | start |
---|---|---|---|
101 | 1 | Section 1 | 2016-01-03 00:00:00.000 |
101 | 2 | Section 2 | 2016-01-03 00:00:00.000 |
101 | 10 | Section 3 | NULL |
实际结果:
appId | stepId | section | start |
---|---|---|---|
101 | 1 | Section 1 | 2016-01-03 00:00:00.000 |
101 | 2 | Section 2 | 2016-01-03 00:00:00.000 |
解决方案:
错误的行为是由于在 WHERE 子句中包含右侧表 (#appProgress) 引起的。通过将此条件移至 LEFT JOIN 的 ON 子句,可以实现所需的结果:
Select P.appId, S.stepId, S.section, P.start From #appSteps S With (NoLock) Left Join #appProgress P On S.stepId = P.stepId And P.appId = 101 Where S.section Is Not Null
在 LEFT JOIN 中,WHERE 子句在联接之后执行,这意味着从右开始的行 -不满足 WHERE 子句条件的手表将从结果集中排除。在 WHERE 子句中包含右侧表可以有效地将其转换为 INNER JOIN,从而过滤掉预期结果。
以上是为什么我的左连接结果中缺少行?的详细内容。更多信息请关注PHP中文网其他相关文章!