你能给我以下代码的替代查询吗?
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 语法。此外,对联接中的所有列使用限定符(表别名),即使它们并不总是绝对必要的;这样代码更容易阅读。