我如何存储select语句的结果,以便我可以重用结果来连接到不同的表?

时间:2013-05-31 08:45:01

标签: sql oracle10g

如何存储select语句的结果,以便我可以重用结果来连接到不同的表?这也将在游标内。

下面是一些伪代码,在这个例子中我保持了Select语句简单,但在现实生活中它是一个带有多个连接的长查询,我必须使用相同的SQL两次连接到2个不同的表,因为它是很长,可以在将来改变,因此我希望能够重复使用它。

我已经尝试创建一个视图并将select语句的结果存储在其中,但似乎我无法在游标循环中创建一个视图,当我尝试时我得到了#34;遇到符号& #34; CREATE""错误。

DECLARE TYPE cur_type IS REF CURSOR;
CURSOR PT_Cursor IS

    SELECT * FROM Table1

    PT_Cursor_Row   PT_Cursor%ROWTYPE;

BEGIN
 OPEN PT_Cursor;

 LOOP
    FETCH PT_Cursor INTO PT_Cursor_Row;
    EXIT WHEN PT_Cursor%NOTFOUND;

    Select ID From Table2 --this is actually a long complext query
        INNER JOIN Table3 ON Table2.ID = Table3.ID
    WHERE Table2.ID = PT_Cursor_Row.ID

    Select * From Table2 --this is actually a long complext query
        LEFT JOIN Table4 ON Table2.ID = Table4.ID
    WHERE Table2.ID = PT_Cursor_Row.ID                               

END LOOP;

 CLOSE PT_Cursor;
END; 

2 个答案:

答案 0 :(得分:3)

保存查询结果的一种方法是通过临时表格 - this question的简短答案描述了如何创建它们,而有更长的答案here讨论如何使用它们,可能的替代方案。

答案 1 :(得分:2)

临时表当然是一个可行的选择。 也可以使用with语句来“重用”结果集。

WITH 
PEOPLE AS 
(
    SELECT 'FRED'   NAME, 12 SHOE_SIZE FROM DUAL UNION ALL
    SELECT 'WILMA'  NAME,  4 SHOE_SIZE FROM DUAL UNION ALL
    SELECT 'BARNEY' NAME, 10 SHOE_SIZE FROM DUAL UNION ALL
    SELECT 'BETTY'  NAME,  3 SHOE_SIZE FROM DUAL
),
WOMAN AS
(
    SELECT 'BETTY'  NAME FROM DUAL UNION ALL
    SELECT 'WILMA'  NAME FROM DUAL
)
SELECT 'WOMANS ', PEOPLE.NAME, PEOPLE.SHOE_SIZE
FROM PEOPLE, WOMAN
WHERE PEOPLE.NAME = WOMAN.NAME

UNION ALL

SELECT 'MENS   ', PEOPLE.NAME, PEOPLE.SHOE_SIZE
FROM PEOPLE, WOMAN
WHERE PEOPLE.NAME = WOMAN.NAME(+) 
  AND WOMAN.NAME IS NULL