簡體   English   中英

SQL Server LEFT JOIN和WHERE子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM