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)
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 子句中的条件,我们就不需要任何这些,因此最终应该得到一个更好的执行计划。
| 归档时间: |
|
| 查看次数: |
60066 次 |
| 最近记录: |