在这个SQL语句中使用双内连接的原因是什么?

Mat*_*ics 10 sql-server

我正在查看这个旧的 SQL 查询。我无法得到的一点是为什么它在同一列上两次内部连接同一个表。我说的是 Table1 和 Table1 以别名“Table1Alias”加入,

SELECT DISTINCT othercolumns,
                Table1Alias.columna
FROM   maintable
       INNER JOIN secondarytable
               ON maintable.id1 = secondarytable.a_id1
       INNER JOIN table1
               ON secondarytable.id2 = table1.id3
       INNER JOIN table1 Table1Alias
               ON secondarytable.id2 = Table1Alias.id3
       INNER JOIN thirdtable
               ON table1.id4 = thirdtable.id5
       INNER JOIN fourthtable
               ON thirdtable.id6 = fourthtable.id7
       INNER JOIN fivetable
               ON thirdtable.id8 = fivetable.id9
       INNER JOIN sixthtable
               ON Table1Alias.columna = sixthtable.id10
       LEFT JOIN seventhtable
              ON thirdtable.id11 = seventhtable.id12
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
       AND secondarytable.type456 = 'cate'
       AND table1.type = '0'
       AND Table1Alias.columna = 'conn'
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 27

像这样重写查询可能会有所帮助,因此很明显 2 个连接是不同的,即连接是到不同的子集(同一表的):

FROM   maintable 
       INNER JOIN secondarytable 
               ON maintable.id1 = secondarytable.a_id1 
       INNER JOIN table1 
               ON secondarytable.id2 = table1.id3 
              AND table1.type = '0' 
       INNER JOIN table1 Table1Alias 
               ON secondarytable.id2 = Table1Alias.id3 
              AND Table1Alias.columna = 'conn' 
       INNER JOIN
       ...
WHERE  LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09' 
       AND secondarytable.type456 = 'cate' 
Run Code Online (Sandbox Code Playgroud)

  • @Darkwing 据我所知,将条件放在哪里并不重要,因为提出最佳执行计划是查询优化器的工作。但是最好将它们放在连接旁边,因为它使它们更具可读性,但这只是一种意见 (3认同)
  • @Mathematics - 如果连接是“OUTER JOIN”,则条件是在连接的“ON”子句中还是在“WHERE”子句中都非常重要。如果“ON”子句中的条件失败,则仍包含主行(没有匹配的外行);如果它在 `WHERE` 子句中失败,那么主行将从结果集中排除。 (3认同)

Sco*_*red 8

查看该where子句,被指向的行table1要求列type= '0',而被指向的行table1alias要求列columna= 'conn'。

也许table1同一行有多行id3