2015-08-24 97 views
2

是左連接在右表上的where子句總是與做內連接相同?SQL Server 2012 - 左連接與哪裏vs內連接

EX:

SELECT * 
FROM table t 
LEFT JOIN table2 t2 on t.id=t2.id 
WHERE t2.name='myName' 

VS

SELECT * 
FROM table t 
INNER JOIN table2 t2 on t.id=t2.id 
WHERE t2.name='myName' 
+2

雖然它可能是相同的,你應該使用內部連接,以避免混淆 –

+2

「始終」是一個非常嚴重的術語。將WHERE t2.name ='myName''改成'WHERE t2.name IS NULL',你會看到有差異。 –

+0

問題不是SQL Server 2012特定的。 – DanteTheSmith

回答

2

是的,你總是會得到來自這兩個查詢相同的結果。唯一一次你會從LEFT連接中獲得不同的結果是,如果由於沒有匹配的id而返回的t2值全部爲NULL。您的WHERE語句消除了所有這些情況。

0

您應該知道SQL(AFAIK)中只有4種類型的連接。

  • INNER(向左或向右沒什麼區別就在這裏它是相同的連接)

  • OUTER - 左,右

  • FULL

注:不計WHERE子句變體!

與建立在做外連接明確地只接受空值時,WHERE子句,你得到了著名7加入與維恩圖:

7 joins Venn diagrams

問題是,大多數DSMS讓你忽略了一些從語法詞

每個加入應具有(從每行1)整個組下述的組合:

LEFT或RIGHT(左邊是默認值)

外或內(外是默認值)

JOIN

所以,當你寫LEFT JOIN你至少應該在頭上寫完整的語法: LEFT OUTER JOIN 當你寫JOIN完整的語法是: LEFT INNER JOIN

2現在看起來不一樣。之間的內部和外部連接

區別是在列中的空值,你正在做的加入ON

外連接(如果離開,第二個如果右一臺)具有從主表中的所有記錄。由於輔助表中沒有匹配,所以該列沒有值,它們的值將爲空,但這些行將顯示在結果中。

INNER連接只有來自主表的成功管理加入輔助表的那些值。如果列中存在空值,那麼該行上的連接將不會被連接,因此在結果中將被忽略。

QUICK例

表阿


1 BLA 2

2 BLA空

3 BLA 3

表乙


1 BLA 3

2 BLA空

3 BLA 3

LEFT OUTER JOIN:

1 BLA 2 2 BLA空

2 BLA null null null null

3 BLA 3 3 BLA 3

JEFT INNER JOIN

1 BLA 2 2 BLA空

3 BLA 3 3 BLA 3

您的示例SPECIFIC注: 由於我假設你通過兩個表的主鍵進行連接,所以這絕不會發生(空值),因爲主鍵在其定義中包含非null的約束,並且您將永遠不會看到這種差異。 此外,你需要從第二行中的列值(非空)

+0

這不回答OP的問題。 – Eric

+0

是的,閱讀整篇文章! IT也給他一個處理所有這些問題的一般方法,而不是簡單地說明:在你的情況下是,但通常不是! – DanteTheSmith