单个语句中的多个内部联接与成对联接

时间:2014-06-30 17:31:00

标签: sql db2 inner-join

我得到了别人加入9(!)表的代码 - 我过去使用它没有任何问题,但现在所有的表都随着时间的推移而增长,所以我得到了奇怪的空间错误。

我得到了建议来分解连接并进行多个成对连接。应该很简单,因为所有的连接都是内部的,我读到的所有内容都说在这种情况下顺序应该没有区别 - 但是我得到的案例数量与我应该的数量不同。没有给出任何特定的非常复杂的例子,有什么可能的原因呢?

由于

1 个答案:

答案 0 :(得分:0)

  

对我来说,在一个声明中加入9个表是很多的!成对可能   一直不精确 - 我的意思是加入两个表然后加入   结果到另一个表,然后结果到另一个表。明显   他们的订购程度达到必要的密钥   每一点。

这对我来说并不明显。事实上,事实并非如此。 MOST SQL平台(您还没有说过您正在使用哪个)编译SQL语句并形成执行计划。该计划将在执行连接时进行优化和移动。在许多并行运行的系统上,它们将同时执行连接。

理解陈述的“顺序”的方法是查看执行计划。

控制订单的方法(在许多系统上)是使用CTE。像这样:

WITH subsetofbigtable AS
(
   SELECT *
   FROM reallybigtable
   WHERE date = '2014-01-01'
)
SELECT *
FROM subsetofbigtable
JOIN anothertable1 ...
JOIN anothertable2 ...
JOIN anothertable3 ...
JOIN anothertable4 ...
JOIN anothertable5 ...

您还可以将CTE链接到“订购”连接:

WITH subsetofbigtable AS
(
   SELECT *
   FROM reallybigtable
   WHERE date = '2014-01-01'
), chain1 AS
(
   SELECT *
   FROM subsetofbigtable
   JOIN anothertable1 ...
), chain2 AS
(
   SELECT *
   FROM chain1
   JOIN anothertable2 ...
)
SELECT *
FROM chain2
JOIN anothertable3 ...
JOIN anothertable4 ...
JOIN anothertable5 ...