2010-10-06 52 views
0

我已經看到了一個剛剛參加這樣的:加入條款加入3代表在同一​​標準

Select <blablabla> 
from 
    TableA TA 
    Inner join TableB TB on Ta.Id = Tb.Id 
    Inner join TableC TC on Tc.Id = Tb.Id and Ta.OtheriD = Tc.OtherColumn 

可是那個第二聯接子句的點(終點效應)?
使用外部連接子句時的含義是什麼?
而且,更重要的是,什麼是最好的重寫方式,很容易 瞭解它試圖加入?
而且,更重要的是,重寫它以擺脫構造 並保持查詢的正確性的最佳方法是什麼。
我不指定RDBMS,因爲它是一個更通用的問題,但對於那些 好奇(因爲人們總是問):這是SQL Server 2005中

編輯:這只是一個由例子(因爲我會必須挖掘原始來源 - 我再也無法訪問)。我發現原來的加入條款是10加入SELECT命令。

+0

Tc.OtherColumn。固定 – 2010-10-06 18:46:20

+0

-1沒有指向這個問題 – gbn 2010-10-06 19:01:14

回答

2

您的問:但第二個連接子句的意義(最終效果)是什麼?

有效地過濾行......如果您真的想要,可以將on語句的後半部分移動到where子句中,只會影響可讀性。 gbn的答案看起來不錯,但爲了擴展它......有時候這樣的重寫是不可能的。我已經看到了一個場合,兩個不同的系統(一個oracle 8i和一個SQL server 2000)將他們的數據庫連接在一起。一個3部分的密鑰被確定爲需要在兩個系統中使記錄獨一無二,但是3部分密鑰的每個部分都保存在不同的表中......最終的結果有幾個這樣的連接。

功能上......我不確定是否真的有區別。除非我徹底關閉,否則可讀性似乎是最大的區別。

你的第二個問題:當使用外部聯接子句時會有什麼影響?

你可能會得到一堆空值(等待你設置外連接的方式),而內連接會丟掉它們。小心,儘管...內部聯接是聯想...正如gbn所說:一個外部聯接是不同的,訂單確實很重要

3

它只是意味着你對tablea和tablec之間的交集有額外的限制。

因爲我們知道Ta.Id = Tb.Id,Tc.Id = Tb.IdTc.Id = Ta.Id相同。內部連接是關聯的。因此,它使這樣更有意義,所以每個連接是2個表格僅

Select <blablabla> 
from 
    TableB TB 
    Inner join 
    TableA TA on Tb.Id = Ta.Id --a and b intersection 
    Inner join 
    TableC TC on Ta.Id = Tc.Id and Ta.OtheriD = Tc.Column --a and c intersection 
+0

似乎我必須重新排序連接,以便能夠消除'ON'子句中的兩個表條件。hmmmm – 2010-10-06 18:39:51

+0

@Fabricio Araujo:它和JOIN一樣,並且會給出相同的結果,因爲「INNER JOIN」是關聯和可交換的。我希望澄清一下你的情況。 – gbn 2010-10-06 18:42:52

+0

閱讀編輯。這是成立,舉例來說。它可能是一個外部連接。我只是使用內部連接 ​​- 我只是想了解這種結構的效果和最好的(不太危險的)方式。 – 2010-10-06 18:57:55

1

用戶可能希望furthur篩選一套包括在加入設定的行...

0

點之間第二次連接將根據TableC的內容進一步限制結果集。第一次加入只給你TA和TB中存在的記錄。第二次連接僅給出TC中第一次連接的結果。