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 JOIN
对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 语法。此外,对连接中的所有列使用限定符(表别名),即使它们并非总是严格必要的;以这种方式阅读代码要容易得多。
【讨论】:
以上是关于ORACLE 11G 中的 WITH 子句使用 UNION ALL的主要内容,如果未能解决你的问题,请参考以下文章
低于 11g 的 Oracle 版本中的 Oracle "into" 子句
Connect By 子句适用于 11g,但不适用于 Oracle 8i:“ORA-01436:用户数据中的 CONNECT BY 循环”