2012-09-15 69 views
2

如果可以簡單地編寫一個完整的外連接,那麼左連接(或者甚至可能是內連接)的用途是什麼?所以爲什麼要留下連接(爲什麼不在外部連接中加入where條件)

playorm=# select * from trade as a full outer join Account as b on b.id=a.accoun 
tid where a.id = a.id; 

這最終返回所有相同的結果,左內連接將返回。

,或者如果你想要一個內部聯接,你可以做到這一點

playorm=# select * from trade as a full outer join Account as b on b.id=a.accoun 
tid where a.id = a.id AND b.id = b.id; 

這最終返回所有的INNER JOIN將返回相同的結果。

我只是覺得這是有趣的是我所有的想法。我本來認爲一個左外連接會返回零值+條件匹配,但發現條件必須匹配,這是有點怪異的,因爲在這個內部連接消除匹配的記錄(可能是因爲連接是在表達式匹配之前完成的,所以a .accountid是空的where子句中的無用的部分...

select * from trade as a inner join Account as b on b.id=a.accountid 
here (b.isActive=false OR a.accountid is null) and a.number < 15; 

後, 院長

+3

這個問題是重複的:http://stackoverflow.com/questions/419375/sql-join-differences –

+0

啊,我知道內部和外部連接的區別。這個問題顯然不是重複的。 –

+0

我編輯了問題以突出顯示我的意圖....兩個外連接查詢實際上是一個左連接和內連接,即使您在SQL中讀取了一個OUTER JOIN ....我認爲您證明了第一個人的觀點下面的答案相當好,雖然;)。 –

回答

5

我不太清楚你的問題的意圖。你的意思是「爲什麼SQL支持左外連接的語法,當它易於使用全外連接的語法時,額外的xxx不爲空條件?「換句話說,是否l eft-outer-join似乎是不必要的語法糖?

答案:您可以使用語法糖讓您的含義更清晰,以便讀取您的代碼的其他人閱讀。例如,假設一所學校有一張學生桌和一張課程表。如果您想查看學生名單以及他們通過哪些課程(包括沒有通過任何內容的學生),那麼左外連接會使該意圖清晰。如果我在你的代碼中看到完整的外連接,我可能會認爲你也對沒有人通過的課程感興趣。在篩選出那些不匹配的課程的條件中,需要仔細研究一下你的代碼才能找到這個子句。

像我這樣的程序員經常會受到時間緊迫,所以他們不會深入理解您的代碼,所以請給出提示以幫助我們理解您的意圖。使用synactic糖來增加同事的職業生涯。

順便說一下,你聲明「內連接消除匹配的記錄」。你是不是說「內連接消除不在匹配在其他表中的記錄」?實際上,最好將內連接視爲返回所有匹配的記錄,並將左外/右外/全外連接作爲對來自第一/第二/兩個表的不匹配記錄的innner連接的補充。

+0

,我認爲你的觀點通過對他不瞭解我的問題的問題的第一個評論得到很好的證實;)。 –