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,我们将及时予以处理。 |
相关内容
网友评论
推荐文章
-
一、 并行查询 并行查询允许将一个sql select语句划分...[详细]
-
近日,生鲜电商赛道传出有企业赴美上市的消息吸引不少...[详细]
-
重启TNSLSNR? 打开CMD,输入以下命令。 lsnrctl stop ...[详细]
-
sqlplus / as sysdba 登录数据库以最高权限登录 SQL*P...[详细]
-
这两天,很多人都突然发现应用市场多了个不认识的APP...[详细]
-
https://blog.csdn.net/indexman/article/details/802...[详细]
-
我有几个没有主键的oracle表.我无法修改此数据库设计,...[详细]
-
oracle – 当我从未编程时按Enter键时,为什么APEX会提交?
我在Oracle APEX 4.2中发现了这种行为:您创建了一个...[详细]
-
获取使用SQLAlchemy 0.7.8和Oracle XE生成的“错误”类型
任何人都可以告诉我为什么下面的DateTime类型创建一个...[详细]
-
Oracle中for update和for update nowait的区别
1、 for update?和 ?for update nowait?的区别: 首先...[详细]
热点阅读