LEFT JOIN子句中的INNER JOIN

idd*_*dqd 8 sql t-sql

我得到一个查询,使用一些非常奇怪的语法进行连接,我需要了解如何使用此连接:

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是每个Pool的独特帐户列表#
  • T3是一个独特的列表(一组帐户)

我需要为T1中的每条记录返回T2中保存的先前帐号.我还需要为每个池返回T3 Pool#.

我想要了解的是为什么有人会以这种方式编写代码.这对我来说没有意义.

HLG*_*GEM 9

稍微缩进会向您展示更好的意图

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)

  • 是的,我确信左边没有被否定,不幸的是我们有一个热爱这个愚蠢建筑的开发者,我每天都看到它. (2认同)