LEFT JOIN子句中的INNER JOIN

问题描述 投票:7回答:2

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

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#
  • T1是不同的帐户列表
  • T2是每个池编号的不同帐户列表
  • T3是一个不同的pool列表(帐户组)

我需要为T1中的每个记录返回T2中持有的先前帐号。我还需要为每个池返回T3池号。

我想理解的是为什么有人会用这种方式编写代码。对我来说这没有意义。

sql tsql
2个回答
8
投票

稍微缩进可以更好地显示您的意图

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#

这是一种有效的语法,会稍微强加连接顺序。基本上,它只询问表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#

1
投票

外部申请在这里会更清楚:

SELECT
    T1.Acct#, 
    T4.New_Acct#, 
    T4.Pool#
FROM DB.dbo.ACCT_TABLE T1
OUTER APPLY  
(
    SELECT 
        T2.New_Acct#, 
        T3.Pool#
    FROM DB.dbo.CROSSREF_TABLE T2
    INNER JOIN DB.dbo.POOL_TABLE T3 ON T2.Pool# = T3.Pool#
    WHERE T1.Acct# = T4.Prev_Acct#
) T4
© www.soinside.com 2019 - 2024. All rights reserved.