是左連接在右表上的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'
是左連接在右表上的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'
是的,你總是會得到來自這兩個查詢相同的結果。唯一一次你會從LEFT連接中獲得不同的結果是,如果由於沒有匹配的id而返回的t2值全部爲NULL。您的WHERE語句消除了所有這些情況。
您應該知道SQL(AFAIK)中只有4種類型的連接。
INNER(向左或向右沒什麼區別就在這裏它是相同的連接)
OUTER - 左,右
FULL
注:不計WHERE子句變體!
與建立在做外連接明確地只接受空值時,WHERE子句,你得到了著名7加入與維恩圖:
問題是,大多數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的約束,並且您將永遠不會看到這種差異。 此外,你需要從第二行中的列值(非空)
這不回答OP的問題。 – Eric
是的,閱讀整篇文章! IT也給他一個處理所有這些問題的一般方法,而不是簡單地說明:在你的情況下是,但通常不是! – DanteTheSmith
雖然它可能是相同的,你應該使用內部連接,以避免混淆 –
「始終」是一個非常嚴重的術語。將WHERE t2.name ='myName''改成'WHERE t2.name IS NULL',你會看到有差異。 –
問題不是SQL Server 2012特定的。 – DanteTheSmith