我在重构的旧系统中有以下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
它正在生成大量的记录并杀死系统,但有人可以解释语法吗?这可以用其他方式表达吗?
> Table1包含419行
> Table2包含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
解决方法
为了可读性,我重构了查询…从表1最顶层的级别开始,然后与Table3相关联,然后将table3与table2绑定.如果你遵循关系链,更容易遵循.
现在,回答你的问题.作为笛卡尔积的结果,你会收到大笔数字.对于表1中与表3中匹配的每个记录,您将具有X * Y.然后,对于table3和Table2之间的每个匹配都将具有相同的影响… Y * Z …所以您的结果只有一个可能的ID在表1中可以有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(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