2016-03-07 70 views
-1

由於需要大量數據,我有一個SQL查詢需要很長時間來執行(像30分鐘!)。SQL - 查詢自加入而不執行兩次

但是,我需要做一些更多的關於這個結果的自我加入這個查詢。

我無法在此數據庫上創建臨時表。

我想要的是一種方法來執行此自我連接而不執行此查詢兩次。

有沒有辦法寫一個主查詢(也許用'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查詢這裏」將被執行兩次,這是我的問題。

+3

發表您的查詢! – Hawk

+0

請發佈您想要實現的最小范例(包括DDL和DML語句以生成適當的表格和示例數據),並告訴我們預期的結果是什麼。消除自連接有多種可能性(有時使用分析函數或分層查詢 - 但同樣可能無法消除連接),但除非我們知道問題是什麼,否則我們無法提供幫助。 – MT0

+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; 
+0

完美。這正是我所期待的。 –