oracle 不用左外连接,Oracle 左外连接的一些测试

为了更加深入左外连接,我们做一些测试,外连接的写法有几种形式,我们可以通过10053跟踪到最终SQL转换的形式。

--初始化数据

create table A

(

id number,

age number

);

create table b

(

id number,

age number

);

insert into A values(1,10);

insert into A values(2,20);

insert into A values(3,30);

insert into B values(1,10);

insert into B values(2,20);

commit;

--用10053找到最终转换后的SQL

alter session set session_cached_cursors =0;

alter session set events ‘10053 trace name context forever, level  1‘;

explain plan for select * from A left join B on A.id = B.id and A.age > 5;

explain plan for select * from A left join B on A.id = B.id WHERE A.age > 5;

explain plan for select * from A left join B on A.id = B.id and b.age > 5;

explain plan for select * from A left join B on A.id = B.id where b.age > 5;

alter session set events ‘10053 trace name context off‘ ;

select * from A left join B on A.id = B.id and A.age > 5;

ID        AGE         ID        AGE

---------- ---------- ---------- ----------

1         10          1         10

2         20          2         20

3         30

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

WHERE "A"."ID" = "B"."ID"(+)

AND "A"."AGE" > CASE WHEN("B"."ID"(+) IS NOT NULL) THEN 5 ELSE 5 END

select * from A left join B on A.id = B.id WHERE A.age > 5;

ID        AGE         ID        AGE

---------- ---------- ---------- ----------

1         10          1         10

2         20          2         20

3         30

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

WHERE "A"."AGE" > 5

AND "A"."ID" = "B"."ID"(+);

select * from A left join B on A.id = B.id and b.age > 5;

ID        AGE         ID        AGE

---------- ---------- ---------- ----------

1         10          1         10

2         20          2         20

3         30

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

WHERE "A"."ID" = "B"."ID"(+)

AND "B"."AGE"(+) > 5

--这种形式你可以看到外连接失效,CBO还是非常聪明的

select * from A left join B on A.id = B.id where b.age > 5;

ID        AGE         ID        AGE

---------- ---------- ---------- ----------

1         10          1         10

2         20          2         20

--Final query after transformations:

SELECT "A"."ID" "ID", "A"."AGE" "AGE", "B"."ID" "ID", "B"."AGE" "AGE"

FROM "GG_TEST"."A" "A", "GG_TEST"."B" "B"

WHERE "B"."AGE" > 5

AND "A"."ID" = "B"."ID";

原文:http://blog.csdn.net/stevendbaguo/article/details/38870319

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值