设为首页 - 加入收藏 华夏网 (http://www.hxwgxz.com)- 云主机,资讯,互联网,人工智能,云计算,大数据,区块链,VR,站长网!
热搜: 2017 2018 什么 市场
当前位置: 主页 > 站长百科 > 正文

VIEW中的Oracle SQL Reuse子查询

发布时间:2021-01-23 06:07 所属栏目:[站长百科] 来源:网络整理
导读:我正在尝试设置一个可能包含1000个记录的视图.某些字段需要子查询,这些子查询返回完全相同的数据.我想知道我是否可以在视图中查询一次,而不是每次都运行它. 下面是一些示例表/数据: DROP VIEW MYVIEW;DROP TABLE MYTABLE;DROP TABLE MYTABLE_PARENT;-- TABL

我正在尝试设置一个可能包含1000个记录的视图.某些字段需要子查询,这些子查询返回完全相同的数据.我想知道我是否可以在视图中查询一次,而不是每次都运行它.

下面是一些示例表/数据:

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)

有没有办法在视图中优化内部子查询?

解决方法

要对mytable和mytable_parent进行单独访问,请尝试:

CREATE OR REPLACE FORCE VIEW MYVIEW AS 
  SELECT CS.PRIMARY_KEY AS PARENT_PK,MAX(DECODE(MT.MYVAL,MT.PRIMARY_KEY,TO_NUMBER(NULL))
                        AS OUTPUT_VAL_1,TO_NUMBER(NULL))
                        AS OUTPUT_VAL_2
  FROM MYTABLE_PARENT CS
  LEFT JOIN MYTABLE MT ON MT.PARENT_PRIMARY_KEY = CS.PRIMARY_KEY AND
                          MT.MYVAL IN ('MYVAL1-1','MYVAL1-2')
  GROUP BY CS.PRIMARY_KEY

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章