在 SQL 中使用 LEFT JOIN 时,认识到其独特特征和潜在陷阱至关重要。这个问题说明了一个示例,其中 LEFT JOIN 查询返回意外结果,促使我们深入研究底层机制并解决问题。
LEFT JOIN 操作从左表中检索所有行(在本例中, #appSteps),无论它是否与右表(#appProgress)匹配。右表中任何不匹配的行都被分配 NULL 值。但是,当您在 WHERE 子句 (p.appId = 101) 中包含正确的表时,您实际上将查询转换为 INNER JOIN。
解决方案:
要纠正该问题,需要将过滤右表(p.appId = 101)的谓词从 WHERE 子句移至 ON LEFT JOIN 语句的条件。这会强制连接在执行连接之前过滤正确的表,确保仅包含匹配的行。
调整后的 SQL 语句如下:
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 功能,它将产生预期的结果,包括 #appSteps 中的所有非空行和 #appProgress 中的匹配行,而不会因额外的原因而无意中排除行WHERE 子句中的谓词。
以上是为什么 SQL 中的 LEFT JOIN 返回意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!