SQL - 查询自联接而不执行两次

时间:2016-03-07 08:53:59

标签: sql oracle self-join

我有一个SQL查询,由于需要大量数据,因此需要花费很长时间才能执行(例如30分钟!)。

但是,我需要在此结果上做更多关于自我加入此查询的事情。

我无法在此数据库上创建临时表。

我想要的是一种在不执行此查询两次的情况下执行此自连接的方法。

有没有办法编写主查询(可能带有'WITH'语法)以允许它?

编辑: 以下是可行的示例:

With
MyQueryAlias1 AS
(30 minutes sql query here)

MyQueryAlias2 AS
(30 minutes sql query here)

SELECT
MyQueryAlias1.field1

FROM
MyQueryAlias1
JOIN MyQueryAlias2
ON MyQueryAlias1.field2 = MyQueryAlias2.field3

这只是一个例子,但它显示“30分钟sql查询在这里”将被执行两次,这是我的问题。

1 个答案:

答案 0 :(得分:2)

您可以将查询简化为:

WITH MyQueryAlias1 AS (30 minutes sql query here)
SELECT q1.field1
FROM   MyQueryAlias1 q1
       JOIN MyQueryAlias1 q2
       ON q1.field2 = q2.field3

将摆脱第二个子查询因子条款。

这可能也有效:

WITH MyQueryAlias1 AS (30 minutes sql query here)
SELECT field1
FROM   MyQueryAlias1
WHERE  LEVEL = 1
AND    ( field2 = field3 OR CONNECT_BY_ISLEAF = 0 )
CONNECT BY NOCYCLE
       PRIOR field2 = field3
AND    LEVEL = 2;