2012-08-27 39 views
1

我不太確定如何描述這一點,我不太確定它是否只是語法糖。這是我第一次看到它,而且我無法找到對其原因和內容的參考或解釋。是否有文檔可以解釋TSQL中的嵌套連接?

我有一個查詢,如下所示:

select * from 
    table1 
      join table2 on field1 = field2 
      join (
       table3 
        join table4 on field3 = field4 
        join table5 on field5 = field6 
       ) on field3 = field2 
       -- notice the fields in the parens and outside the parens 
       -- are part of the on clause 

是必要的括號?刪除它們會改變連接順序嗎?在這種情況下,我在SQL Server 2005環境中。謝謝!

+0

我恨語法和刪除只要有可能。儘管嵌套連接是左連接,但我更常見它。我不相信需要的人,但如果我留下語法,我會保留它們,因爲它會提醒保險箱發生了一些不尋常的事情。我會嘗試這一個,因爲正常連接時間和兩個結果,看看是否嵌套聯接更快。如果保留它,否則,擺脫這種非標準語法。 – HLGEM

回答

3

加入順序應在結果集中使用自然查詢沒有差別加入(外列順序)。查詢

select * 
from t1 
join t2 on t2.t1_id = t1.id 

產生相同的結果設置爲

SELECT * 從T2 如果您使用外連接上t1.id = t2.t1_id

T1聯接和變化from子句中的表的順序自然必須改變外連接的方向:

select * 
from  t1 
left join t2 on t2.t1_id = t1.id 

相同

select * 
from  t2 
right join t1 on t1.id = t2.t1_id 

然而,如果你看到作爲表子查詢,語法像

select * 
from t1 
join (select t2.* 
     from t2 
     join t3 on t3.t2_id = t2.id 
     where t3.foobar = 37 
    ) x on x.t1_id = t1.id 

你會注意到表的別名(x)分配給子查詢以上。

你有什麼是派生表(儘管有人稱之爲虛擬表)。您可以將其視爲存在於查詢生命中的臨時視圖。當您需要根據聚合結果(group by)進行過濾時,它特別有用。

select的T-SQL文檔中,from條款下進入細節:

+0

我瞭解派生表/子查詢。我的問題中的語法只是一個簡寫,允許在括號內省略'select * from'? – IronicMuffin

+0

否 - 「from」子句的語法只允許您看到的括號。表格源可以是很多東西(表名,行集函數,用戶定義的函數,openXML,派生表,旋轉表或未轉義表)。有些地方可能需要括號來消除歧義,但通常,對於「直接」SQL使用簡單的表名連接,括號不應該有任何區別,我擔心,事實上,他們可能會拋出查詢優化器,迫使它以次優序列做事情,應該讓查詢優化器做它的工作作爲一般規則。 –

2

在這種情況下,他們是沒有必要的:

select * from table1 
join table2 on field1 = field2 
join table3 on field3 = field2 
join table4 on field3 = field4 
join table5 on field5 = field6 

產生相同的結果。

+0

-1因爲它沒有解決我的問題。 – IronicMuffin

+0

@IronicMuffin你的問題有兩個?分數。 「括號是否必要?刪除它們會改變連接順序嗎?」那不是直接回答你的問題嗎? +1 – Paparazzi

+0

謝謝Blam的幫助 –

2

在這種情況下沒有必要。

這是必要的(或至少是,簡單了很多),在另外一些國家,特別是當你的名字的嵌套調用:

select table1.fieldX, table2.fieldY, sq.field6 from 
table1 join table2 on field1 = field2 
join (select 
    top 1 table3.field6 
    from table3 join table4 
    on field3 = field4 
    where table3.field7 = table2.field8 
    order by fieldGoshIveUsedALotOfFieldsAlready 
      ) sq on sq.field6 = field12345 

你有代碼可能已被:

  1. 像上面一樣,然後重構。
  2. 機器生產。
  3. 反映開發人員在進入查詢時的思考過程,因爲他們將較大查詢的那部分視爲一個單元,然後將其應用到較大的查詢中。
+0

從連接表3連接表4 ???我不認爲這是正確的語法 –

+0

@АртёмЦарионов不是,那是一個錯字。 –

相關問題