admin

SQL连接格式-嵌套内部连接

sql

我在重构的旧系统中有以下SQL语句。这是此问题的缩写视图,只是暂时返回count(*)。

SELECT COUNT(*)
FROM Table1 
    INNER JOIN Table2 
        INNER JOIN Table3 ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2 
    ON Table1.DifferentKey = Table3.DifferentKey

它会生成大量记录并杀死系统,但是有人可以解释其语法吗?可以用其他任何方式表达吗?

  • 表1包含419行
  • 表2包含3374行
  • Table3包含28182行

编辑:

建议重新格式化

SELECT COUNT(*)
FROM Table1 
    INNER JOIN Table3
          ON Table1.DifferentKey = Table3.DifferentKey
    INNER JOIN Table2 
          ON Table2.Key = Table3.Key AND Table2.Key2 = Table3.Key2

阅读 195

收藏
2021-05-10

共1个答案

admin

为了提高可读性,我重新构造了查询…从表1的最顶层开始,然后将其绑定到Table3,然后将table3绑定到table2。如果遵循关系链,则容易遵循得多。

现在,回答您的问题。笛卡尔积的结果是,您得到的数量很大。对于表1中与表3匹配的每个记录,您将得到X
*Y。然后,对于表3和表2之间的每个匹配将具有相同的影响… Y * Z …因此,对于表1中仅一个可能的ID的结果可以有X * Y * Z记录。

这是基于不知道您的表的规范化或内容如何…键是否为PRIMARY键。

Ex:
Table 1       
DiffKey    Other Val
1          X
1          Y
1          Z

Table 3
DiffKey   Key    Key2  Tbl3 Other
1         2      6     V
1         2      6     X
1         2      6     Y
1         2      6     Z

Table 2
Key    Key2   Other Val
2      6      a
2      6      b
2      6      c
2      6      d
2      6      e

因此,在这种情况下,表1与表3的连接将得到12条记录(每1条记录与3条记录中的每条联接)。然后,再次返回表2中的每个匹配记录(5条记录)…总共60(3tbl1 * 4 tbl3 * 5 tbl2)计数。

因此,现在,根据您的1000条记录进行扩展,您会看到混乱的结构如何使母牛(扼要说话)窒息并降低性能。

SELECT
      COUNT(*)
   FROM
      Table1 
         INNER JOIN Table3
            ON Table1.DifferentKey = Table3.DifferentKey
            INNER JOIN Table2
               ON Table3.Key =Table2.Key
               AND Table3.Key2 = Table2.Key2
2021-05-10