我在重构的旧系统中有以下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
它会生成大量记录并杀死系统,但是有人可以解释其语法吗?可以用其他任何方式表达吗?
编辑:
建议重新格式化
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。然后,对于表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