![](/img/trans.png)
[英]Conditional LEFT JOIN clause SQL Server where conditionality in second table
[英]SQL Server LEFT JOIN and WHERE clause
這是我的代碼
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND Table2.IsDefault = 1
Table2為null時會發生問題,因此查詢不返回任何內容。
如何保留查詢的最后部分AND Table2.IsDefault = 1
可選?
我試圖使用OR
來短路查詢,但我發現它與C#不同
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
AND COALESCE(Table2.IsDefault,1) = 1
閱讀評論,看起來您的最佳解決方案實際上是將條件移至連接:
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
因為它是一個OUTER連接,所以如果匹配失敗,你仍然會保留任何Table1信息,並且給出“Table2將始終返回1個條目”的語句,你不會冒着通過移動條件來過濾其他連接結果的風險。 您將獲得與將條件放在WHERE子句中相同的結果。
將conidtion移動到ON子句的原因是COALESCE()
, ISNULL()
和OR
都會導致索引出現問題。 根據ON子句中的條件,我們不需要任何這些條件,因此最終應該有一個更好的執行計划。
試試這個 :
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND isnull(Table2.IsDefault,1) = 1
你幾乎在那里:-)
SELECT ID, Name, Phone FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12
AND (Table2.IsDefault IS NULL OR Table2.IsDefault = 1);
在與表1結合使用之前,使用子查詢過濾表2的結果:
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN (SELECT * FROM Table2 WHERE IsDefault = 1) AS Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.