我得到一个查询,使用一些非常奇怪的语法进行连接,我需要了解如何使用此连接:
SELECT
T1.Acct#
, T2.New_Acct#
, T3.Pool#
FROM DB.dbo.ACCT_TABLE T1
LEFT JOIN DB.dbo.CROSSREF_TABLE T2
INNER JOIN DB.dbo.POOL_TABLE T3
ON T2.Pool# = T3.Pool#
ON T1.Acct# = T2.Prev_Acct#
Run Code Online (Sandbox Code Playgroud)
我需要为T1中的每条记录返回T2中保存的先前帐号.我还需要为每个池返回T3 Pool#.
我想要了解的是为什么有人会以这种方式编写代码.这对我来说没有意义.
稍微缩进会向您展示更好的意图
SELECT
T1.Acct#
, T2.New_Acct#
, T3.Pool#
FROM DB.dbo.ACCT_TABLE T1
LEFT JOIN DB.dbo.CROSSREF_TABLE T2
INNER JOIN DB.dbo.POOL_TABLE T3
ON T2.Pool# = T3.Pool#
ON T1.Acct# = T2.Prev_Acct#
Run Code Online (Sandbox Code Playgroud)
这是强制连接顺序的有效语法.基本上它仅询问表T2中也在表T3中的记录,然后将它们连接到T1.我不喜欢它,因为它很难维护.我希望得到一个派生表,因为当我需要在六个月后进行维护时,我发现这些更清晰,更容易更改:
SELECT
T1.Acct#
, T2.New_Acct#
, T3.Pool#
FROM DB.dbo.ACCT_TABLE T1
LEFT JOIN (select T2.New_Acct#, T3.Pool#
FROM DB.dbo.CROSSREF_TABLE T2
INNER JOIN DB.dbo.POOL_TABLE T3
ON T2.Pool# = T3.Pool#) T4
ON T1.Acct# = T4.Prev_Acct#
Run Code Online (Sandbox Code Playgroud)