我試圖設置一個可能包含1000條記錄的視圖。某些字段需要返回完全相同數據的子查詢。我想知道是否可以在視圖中查詢一次,而不是每次都運行它。查看內部的Oracle SQL重用子查詢
下面是一些示例表/數據:
DROP VIEW MYVIEW;
DROP TABLE MYTABLE;
DROP TABLE MYTABLE_PARENT;
-- TABLES FOR VIEW
CREATE TABLE MYTABLE_PARENT (PRIMARY_KEY NUMBER PRIMARY KEY);
CREATE TABLE MYTABLE (PRIMARY_KEY NUMBER, MYVAL VARCHAR(255), PARENT_PRIMARY_KEY NUMBER);
INSERT INTO MYTABLE_PARENT VALUES (1);
INSERT INTO MYTABLE_PARENT VALUES (2);
INSERT INTO MYTABLE VALUES (1, 'MYVAL1-1', 1);
INSERT INTO MYTABLE VALUES (2, 'MYVAL1-2', 1);
INSERT INTO MYTABLE VALUES (3, 'MYVAL2-1', 2);
-- VIEW
CREATE OR REPLACE FORCE VIEW MYVIEW AS
SELECT CS.PRIMARY_KEY AS PARENT_PK,
-- THE BELOW STATEMENTS REUSE THE SAME INNER SUBQUERY, IF THE
-- VIEW CONTAINS 1000 ROWS, THE INNER SUBQUERY WILL BE EXECUTED
-- 1000 TIMES, RETURNING THE SAME DATA EACH TIME.
(SELECT PRIMARY_KEY FROM MYTABLE WHERE MYVAL = 'MYVAL1-1' AND
PARENT_PRIMARY_KEY = (SELECT PRIMARY_KEY FROM MYTABLE_PARENT
WHERE PRIMARY_KEY = CS.PRIMARY_KEY)) AS OUTPUT_VAL_1,
(SELECT PRIMARY_KEY FROM MYTABLE WHERE MYVAL = 'MYVAL1-2' AND
PARENT_PRIMARY_KEY = (SELECT PRIMARY_KEY FROM MYTABLE_PARENT
WHERE PRIMARY_KEY = CS.PRIMARY_KEY)) AS OUTPUT_VAL_2
-- DEFINE CS
FROM MYTABLE_PARENT CS;
SELECT * FROM MYVIEW;
SELECT語句的結果如下:
PARENT_PK OUTPUT_VAL_1 OUTPUT_VAL_2
---------------------- ---------------------- ----------------------
1 1 2
2
所以,在上面的查詢,我想運行下面的查詢只有一次在視圖中的每一行:
(SELECT PRIMARY_KEY FROM MYTABLE_PARENT WHERE PRIMARY_KEY = CS.PRIMARY_KEY)
有沒有什麼辦法可以優化內部的subquer視野內的ies?
爲什麼你需要的'SELECT PRIMARY_KEY FROM MYTABLE_PARENT WHERE PRIMARY_KEY = CS.PRIMARY_KEY'查詢呢?爲什麼不使用CS.PRIMARY_KEY? – 2011-12-30 14:34:57