我正在重构的遗留系统中有以下 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/