SQL 连接格式 - 嵌套内连接

标签 sql sql-server sql-server-2005 tsql

我正在重构的遗留系统中有以下 SQL 语句。这是出于本问题目的的缩写 View ,暂时仅返回 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行
  • 表3包含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

最佳答案

为了提高可读性,我重新构建了查询...从表 1 的最顶层开始,然后将其与表 3 联系起来,然后将表 3 与表 2 联系起来。如果您遵循关系链,那么更容易遵循。

现在回答你的问题。由于笛卡尔积,您将获得大量计数。对于 Table1 中与 Table3 中匹配的每条记录,您将得到 X * Y。然后,对于 table3 和 Table2 之间的每个匹配都会产生相同的影响... Y * Z... 因此,表 1 中只有一个可能的 ID 的结果可以有 X * Y * Z 记录。

这是基于不知道表的规范化或内容如何......如果键是主键的话......

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 条记录(每个 in 1 与每个 in 3 连接)。然后,再次对表 2 中的每个匹配记录(5 条记录)进行计算...总共将返回 60 ( 3 tbl1 * 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 

关于SQL 连接格式 - 嵌套内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5099420/

相关文章:

php - 在 yii 中插入后在表上记录用户 session ID(不能将标量值用作数组)

sql - T-SQL 中的 RaiseError 命令

sql - 显示已删除的行 T-SQL

sql-server - 带有百分比符号 (%) 的 THROW 会产生奇怪的错误消息

sql - 如何批量修改所有 sql server 代理作业中的作业步骤命令

sql - SQLITE3 中的跨表更新

sql - 在 sql server 中将列类型从 bigint 更改为 numeric(18,0)

mysql - SQL如何将列追加到单行结果集?

sql - 如何找到当前的交易水平?

SQL 查询仅返回每个组 ID 1 条记录