時退房FROM
條款上this page的語法。我已經轉載了幾個相關的位位置:相關的查詢
[ FROM { <table_source> } [ ,...n ] ]
<table_source> ::=
{
table_or_view_name [ [ AS ] table_alias ]
[ <tablesample_clause> ]
[ WITH (<table_hint> [ [ , ]...n ]) ]
| <some options omitted here>
| <joined_table>
| <some more options omitted here>
}
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <some options omitted here>
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
的幾點在你原來的問題:
所示<joined_table>
-actually唯一一個我第一種形式已經顯示 - 以ON
子句結尾,並且允許在其<join_type>
和其ON
子句之間的任何<table_source>
。
<joined_table>
本身是一個有效的形式<table_source>
。
因此合法的巢一個<joined_table>
的另一個內,在這種情況下,內<joined_table>
的ON
子句將緊跟由外<joined_table>
的ON
子句。我認爲這就是你在查詢中看到的。
爲了驗證,我可以複製你的結果,我創建了適當的內存中的表,並將其代入原始查詢得到:
declare @rc table (id bigint);
declare @etc table (etcid bigint);
declare @cr table (x bigint, id bigint);
declare @cre table (x bigint, etcid bigint, crid bigint);
declare @ca table (id bigint);
declare @cred table (crid bigint, id bigint);
declare @sc table (id bigint);
declare @ec table (id bigint);
declare @ecc table (id bigint);
declare @hcc table (id bigint);
SELECT *
FROM
@rc rc
RIGHT OUTER JOIN
@etc etc/*added*/
INNER JOIN
@CR cr
INNER JOIN @cre cre
ON cr.x = cre.x
INNER JOIN @ca ca
ON cr.ID = ca.ID
ON etc.ETCID = cre.ETCID
LEFT OUTER JOIN @cred cred
ON cre.CRID = cred.CRID
LEFT OUTER JOIN @SC SC
ON cred.ID = SC.ID
RIGHT OUTER JOIN @ec ec
ON cred.ID = ec.ID
LEFT OUTER JOIN @ecc ecc
ON cred.ID = ecc.ID
LEFT OUTER JOIN @hcc hcc
ON cred.ID = hcc.ID
ON rc.ID = cred.ID
只有三個原始查詢之間的差異和我的,他們都不應該影響它是如何工作的:
我用我的等效內存表名替換您的原始表名。
我將原始查詢中的etc
更改爲@etc etc
,給出@etc
表的別名。
我改變了格式,以便每個ON
子句直接位於相應的JOIN
的下面,以便有希望地說明與什麼相關的內容。
下面是我的一些額外的視覺輔助編輯器的截圖:注意每個藍色滿足上面給出的<joined_table>
的定義概括的大表情。綠色箭頭將奇怪的ON
子句與其對應的連接匹配。
所以,是的,它是合法的語法,但沒有,我想不出任何理由,爲什麼你預期的要做到這一點。如果您打算將一組表添加到另一個表中,則可用的替代方法很少,例如子查詢或common table expression。
您或者錯誤地轉錄了SQL語句,或者這不是T-SQL。你不能寫:ON t2.ID = t3.ID ON t2.ID = t1.ID',因爲它甚至不是有效的。如果在其他數據庫管理系統上甚至有效,我會感到驚訝。 – Icarus
查詢中前面可能有一個連接沒有on子句,您的示例已被省略。像https://dba.stackexchange.com/a/125423/3690 –
我的道歉,考慮到評論,我反而複製/粘貼連接並刪除表和列的名稱。 – Brien