2009-11-19 155 views
1

我看到下面的兩個查詢之間沒有區別:連接和不連接選擇之間的區別?

query_join = select a.id, b.name, a.telephone, a.description from tb_industry a left outer join tb_sector b on a.sector_id = b.id 
query_select = select a.id, b.name, a.telephone, a.description from tb_industry a , tb_sector b WHERE a.sector_id = b.id 

結果是完全一樣的。 現在我猜這可能會發生,但我想獲得啓發只有query_join最好的情況以及query_condition最好的情況是什麼?

回答

0

當您想要從所選表格中檢索所有結果時,使用連接以及在匹配時從左側或右側表格(左連接,右連接)中的值。

當您想要顯式匹配時,使用查詢條件樣式。

希望它有幫助! w3schools有這方面的一些簡單和基本的例子。

0

如果他們爲您返回相同的結果,那麼tb_industry中的每個項目都有一個tb_sector中的項目。你的第二個查詢對於左連接的等價物是不正確的,它將是a.sector_id * = b.sector_id。

* =語法已棄用,並在較新的RDBMS中逐步淘汰。

2

它們不盡相同,儘管它們可能會根據您的數據返回相同的結果。

第一個是左外連接,所以如果相應的表沒有匹配的條目,將返回行。

第二個本質上是一個內部聯接,所以不會返回行,除非兩個表都有匹配的條目。

這取決於您的偏好,但查詢複雜時,第一種語法更容易閱讀。

0

聯接是在查詢中表達關係的新語法。它們提供了外部連接的好處,這在where子句中是不可能的(Oracle通過在過濾器中添加(+)來擴展語言,但它非常有限且不容易理解)。在使用內部連接時,無關緊要,結果是一樣的。

這是主觀的,但在我看來,連接更容易閱讀。

0

A Left Outer Join與普通Join不一樣。

左外連接的結果(或只是左連接)爲表A和B總是包含了「左」表(A)的所有記錄,即使加盟條件未找到任何匹配的記錄在「右」表(B)中。

0

使用左外連接的連接查詢會引入來自數據庫的甚至不匹配的記錄。

您的第二個查詢只會帶來匹配的結果。

4

第一個是外部連接。這說明從表格中的行即使表B中沒有匹配的行假設表包含以下數據:

select a.name, a.sector_id from tb_industry a; 

name sector_id 
---- --------- 
A  1 
B  2 
C  3 

Select b.id, b.name from tb_sector b; 

id name 
-- ---- 
1 X 
2 Y 

(注意,沒有tb_sector一行ID 3。)

外連接仍返回從表格中的所有行,與值空值應該有來自表B:

select a.name, a.sector_id, b.name as sector_name 
from tb_industry a left outer join tb_sector b on a.sector_id = b.id; 

name sector_id sector_name 
---- --------- ----------- 
A  1   X 
B  2   Y 
C  3 

其他查詢(內部連接)忽略了不匹配的行:

select a.name, a.sector_id, b.name as sector_name 
from tb_industry , tb_sector b where a.sector_id = b.id; 

name sector_id sector_name 
---- --------- ----------- 
A  1   X 
B  2   Y 

以下查詢也是一個內連接,使用較新的ANSI聯接語法:

select a.name, a.sector_id, b.name as sector_name 
from tb_industry a 
join tb_sector b on a.sector_id = b.id; 

name sector_id sector_name 
---- --------- ----------- 
A  1   X 
B  2   Y 

如果沒有OUTER關鍵字,則聯接是內部聯接。