ORACLE 11G 中的 WITH 子句使用 UNION ALL

Posted

技术标签:

【中文标题】ORACLE 11G 中的 WITH 子句使用 UNION ALL【英文标题】:WITH Clause use UNION ALL in ORACLE 11G 【发布时间】:2017-10-10 06:01:08 【问题描述】:

您能否给我以下代码的替代查询。

PLSQL 代码

我已经使用 WITH 子句变量 TEMP 在 UNION ALL 查询中使用了两个地方,有助于减少在 UNION ALL 查询中只使用一次 TEMP 变量,

DECLARE

  CURSOR CUR Is  
    WITH TEMP AS    
     (SELECT 1 ONE FROM DUAL UNION ALL SELECT 2 ONE FROM DUAL)   
    SELECT RNO, NAME  FROM STUDENT, TEMP T  WHERE RNO = T.ONE   
    UNION ALL   
    SELECT RNO, NAME FROM STUDENT1, TEMP T WHERE RNO = T.ONE;   
BEGIN

  FOR I IN CUR LOOP  
    DBMS_OUTPUT.PUT_LINE(I.RNO||':'||i.name);   
  END LOOP;

END;

表创建脚本

create table student1(rno number,name varchar2(30))    

insert into student1 values(1,'chidam1')    
insert into student1 values(2,'ram1')    
insert into student1 values(3,'divi1')

create table student(rno number,name varchar2(30))

insert into student values(1,'chidam')
insert into student values(2,'ram')
insert into student values(3,'divi')

【问题讨论】:

我们可以看到你的代码做了什么:你需要解释它的目的。在您告诉我们您想要实现的目标之前,我们无法提供替代实施方案。 【参考方案1】:

就像在代数中乘法对加法是可分配的,在集合论中笛卡尔积对联合是可分配的,所以在 SQL 中INNER JOINUNION ALL 是可分配的。

您可以像这样重写您的 SELECT 语句:

with
     temp          as ( ... - your definition here     )
   , student_union as ( select rno, name from student 
                        UNION ALL
                        select rno, name from student1 )
select s.rno, s.name from student_union s inner join temp t on s.rno = t.one
........................

一些注意事项... 尽可能使用 ANSI 连接语法(SQL 标准),不要使用旧的、已弃用的 Oracle 语法。此外,对连接中的所有列使用限定符(表别名),即使它们并非总是严格必要的;以这种方式阅读代码要容易得多。

【讨论】:

以上是关于ORACLE 11G 中的 WITH 子句使用 UNION ALL的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 11g 中的限制子句

低于 11g 的 Oracle 版本中的 Oracle "into" 子句

oracle查询中的“WITH”子句优化

Connect By 子句适用于 11g,但不适用于 Oracle 8i:“ORA-01436:用户数据中的 CONNECT BY 循环”

Oracle 12c 子查询的 WITH 子句中的函数

在 Oracle 中使用 connect by 在 with 子句中访问子查询中的父别名