잠재적으로 1000 개의 레코드가 포함될 수있는보기를 설정하려고합니다. 필드 중 일부는 정확히 동일한 데이터를 반환하는 하위 쿼리가 필요합니다. 때마다 그것을 실행하는 대신보기 내에서 한 번 쿼리 할 수 있는지 궁금 해서요.보기에서 Oracle SQL 재사용 하위 쿼리
PARENT_PK OUTPUT_VAL_1 OUTPUT_VAL_2
---------------------- ---------------------- ----------------------
1 1 2
2
그래서, 위의 쿼리에서, 나는 다음과 같은 쿼리를 실행하려면 :
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 문에서 결과는 다음과 같다 : 아래
는 일부 샘플 테이블/데이터입니다 보기의 각 행마다 한 번만 :(SELECT PRIMARY_KEY FROM MYTABLE_PARENT WHERE PRIMARY_KEY = CS.PRIMARY_KEY)
내부 하위 쿼리를 최적화 할 수있는 방법이 있습니까? 보기 내에서?
(SELECT PRIMARY_KEY FROM MYTABLE_PARENT WHERE PRIMARY_KEY = CS.PRIMARY_KEY)
을하지만 별명 CS
도 MYTABLE_PARENT를 가리키는 :
왜 모든 MYTABLE_PARENT WHERE primary_key와 = CS.PRIMARY_KEY' 쿼리에서'SELECT primary_key와 필요합니까? CS.PRIMARY_KEY를 사용하지 않는 이유는 무엇입니까? –