SQL Server LEFT JOIN和WHERE子句

Fel*_*sso 16 sql sql-server left-join

这是我的代码

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND Table2.IsDefault = 1
Run Code Online (Sandbox Code Playgroud)

Table2为null时会发生问题,因此查询不返回任何内容.

如何让查询的最后一部分AND Table2.IsDefault = 1可选?

我试图使用短路查询,OR但我发现它与C#不同

t-c*_*.dk 29

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 5

 AND COALESCE(Table2.IsDefault,1) = 1
Run Code Online (Sandbox Code Playgroud)

阅读评论,看起来您最好的解决方案实际上是将条件移至连接:

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12 
Run Code Online (Sandbox Code Playgroud)

因为它是 OUTER 连接,所以如果匹配失败,您仍然会保留任何 Table1 信息,并且考虑到“Table2 将始终返回 1 个条目”的语句,您不会冒通过移动条件来过滤其他连接结果的风险。您将得到与将条件放在 WHERE 子句中 相同的结果。

将条件移至 ON 子句的原因是COALESCE()ISNULL()ORall 会导致索引出现问题。有了 ON 子句中的条件,我们就不需要任何这些,因此最终应该得到一个更好的执行计划。