oracle left oin 查找原理,left join 排序问题,求原理概念分析!

本帖最后由 kinghow 于 2016-7-29 16:13 编辑

drop table t_1;

drop table t_2;

create table t_1(c_1  number,c_2 number,c_3 number);

create table t_2(c_1  number,c_2 number);

insert into t_1 values( 1,1,1);

insert into t_1 values( 1,2,2);

insert into t_1 values( 1,2,3);

insert into t_2 values( 1,2);

insert into t_2 values( 2,2);

commit;

SELECT *

FROM t_1 a LEFT JOIN t_2 b ON a.c_1 = b.c_1;

C_1        C_2        C_3        C_1        C_2

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

1          2          3          1          2

1          2          2          1          2

1          1          1          1          2

SELECT *

FROM t_1 a LEFT JOIN t_2 b ON 1=1 and a.c_1 = b.c_1;

C_1        C_2        C_3        C_1        C_2

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

1          1          1          1          2

1          2          2          1          2

1          2          3          1          2

SELECT *

FROM t_1 a LEFT JOIN t_2 b ON a.c_1 = b.c_1 order by a.c_2;

C_1        C_2        C_3        C_1        C_2

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

1          1          1          1          2

1          2          3          1          2

1          2          2          1          2

SELECT *

FROM t_1 a LEFT JOIN t_2 b ON 1=1 and a.c_1 = b.c_1 order by a.c_2;

C_1        C_2        C_3        C_1        C_2

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

1          1          1          1          2

1          2          3          1          2

1          2          2          1          2

SELECT *

FROM t_1 a LEFT JOIN t_2 b ON a.c_1 = b.c_1 order by a.c_1;

C_1        C_2        C_3        C_1        C_2

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

1          2          3          1          2

1          1          1          1          2

1          2          2          1          2

SELECT *

FROM t_1 a LEFT JOIN t_2 b ON 1=1 and a.c_1 = b.c_1 order by a.c_1;

C_1        C_2        C_3        C_1        C_2

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

1          1          1          1          2

1          2          3          1          2

1          2          2          1          2

现实场景中不存在c_3字段,c_3字段在这里用来标识原表中记录顺序。

排序问题的解决:

SELECT *

FROM (select rowid rd,t1.* from t_1 t1) a LEFT JOIN t_2 b ON a.c_1 = b.c_1 order by a.rd;

RD                        C_1        C_2        C_3        C_1        C_2

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

AAQoXNAAIAAJT3PAAA          1          1          1          1          2

AAQoXNAAIAAJT3PAAB          1          2          2          1          2

AAQoXNAAIAAJT3PAAC          1          2          3          1          2

问:

1、为什么left join 会改变结果集中原表中记录顺序?

2、加了 1=1条件后,为什么能保持结果集原表顺序?

3、为什么,加了 order by 后,1=1失效?

4、为什么,order by c_1后出现新的变化?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值