WITH Clause 在 ORACLE 11G 中使用 UNION ALL



你能给我以下代码的替代查询吗?

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')

就像代数中的乘法是分布的而不是加法的,笛卡尔乘积在集合论中是分布的而不是并集的,所以INNER JOIN在SQL中是分布的而不是UNION 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 语法。此外,对联接中的所有列使用限定符(表别名),即使它们并不总是绝对必要的;这样代码更容易阅读。

最新更新