两条查询语句的结果集不一样。求解

z22708387 2017-09-05 11:54:24
前提:
1、table01表内birthday字段为char(8),数据结构为yyyyMMdd。同样的数据存在
2、sql1与sql2查询出来的结果不一样
3、table01表中,只存在sts=‘01’的数据,不存在sts='02'的数据

----------SQL1------------
select rownum, t01.name, t01.birthday
from (
select name, birthday
from table01
where sts = '01'
order by birthday desc) t01
where rownum<=1000;

----------SQL2------------
select rownum, t01.name, t01.birthday
from (
select name, birthday
from table01
where sts = '01'
or sts = '02'
order by birthday desc) t01
where rownum<=1000;

为什么SQL1与SQL2的数据结果不一样?
运行环境:Oracle g11
...全文
794 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mj845573397 2017-09-27
  • 打赏
  • 举报
回复
在最外面一层都加上order by birthday desc这个条件,可能就一样了
bw555 2017-09-14
  • 打赏
  • 举报
回复
应该是oracle执行时自身做优化了 可以查看下两条语句的执行计划,比较下两者的差异
碧水幽幽泉 2017-09-13
  • 打赏
  • 举报
回复
楼主,我上面说的,是否明白了?
碧水幽幽泉 2017-09-13
  • 打赏
  • 举报
回复
原因很简单,如果table01表中的数据量小于或等于1000,那边SQL1和SQL2的结果会是完全一样。
但是当表的数据量大于1000时,数据就很可能不同了。
因为在oracle中,查询的结果是无序的。 就是说rownum<=1000是随机从table01中取1000条数据。
z22708387 2017-09-11
  • 打赏
  • 举报
回复
引用 7 楼 wmxcn2000 的回复:
[quote=引用 5 楼 z22708387 的回复:] 其实当我遇到这个问题时,我的想法跟大家一样。特别也对birthday值相同的问题研究过。但是最终的结果就是不一样。 每次Sql1与Sql2查询出来的数据完全不一样。
都研究过了,那还有什么好纠结的?[/quote] 但是最终原因我还是不知道啊
dzhfly 2017-09-10
  • 打赏
  • 举报
回复
既然table01表中,只存在sts=‘01’的数据,不存在sts='02'的数据,直接select rownum, t01.name, t01.birthday from ( select name, birthday from table01 order by birthday desc) t01 where rownum<=1000;搞这么多条件做什么,多个条件开销就变大,查询时间增长,放在大量数据多用户使用下,这都是不好的习惯。这样可能更好select rownum,name,birthday from table01 where rownum<=1000 order by birthday desc
卖水果的net 2017-09-10
  • 打赏
  • 举报
回复
引用 5 楼 z22708387 的回复:
其实当我遇到这个问题时,我的想法跟大家一样。特别也对birthday值相同的问题研究过。但是最终的结果就是不一样。 每次Sql1与Sql2查询出来的数据完全不一样。
都研究过了,那还有什么好纠结的?
z22708387 2017-09-09
  • 打赏
  • 举报
回复
引用 楼主 z22708387 的回复:
前提: 1、table01表内birthday字段为char(8),数据结构为yyyyMMdd。同样的数据存在 2、sql1与sql2查询出来的结果不一样 3、table01表中,只存在sts=‘01’的数据,不存在sts='02'的数据 ----------SQL1------------ select rownum, t01.name, t01.birthday from ( select name, birthday from table01 where sts = '01' order by birthday desc) t01 where rownum<=1000; ----------SQL2------------ select rownum, t01.name, t01.birthday from ( select name, birthday from table01 where sts = '01' or sts = '02' order by birthday desc) t01 where rownum<=1000; 为什么SQL1与SQL2的数据结果不一样? 运行环境:Oracle g11
引用 2 楼 jdsnhan 的回复:
具体怎么不一样? select name, birthday from table01 where sts = '01' or sts = '02' order by birthday desc 这个结果集呢
引用 3 楼 wmxcn2000 的回复:
如果 birthday 这列,存在重复值的话,得到的结果可能是不稳定的。
其实当我遇到这个问题时,我的想法跟大家一样。特别也对birthday值相同的问题研究过。但是最终的结果就是不一样。 每次Sql1与Sql2查询出来的数据完全不一样。
fengshuo850420 2017-09-08
  • 打赏
  • 举报
回复
rownum的问题吧, 建议使用里面的那个select来定义rownum试一下
卖水果的net 2017-09-06
  • 打赏
  • 举报
回复
如果 birthday 这列,存在重复值的话,得到的结果可能是不稳定的。
jdsnhan 2017-09-06
  • 打赏
  • 举报
回复
具体怎么不一样? select name, birthday from table01 where sts = '01' or sts = '02' order by birthday desc 这个结果集呢
ckc 2017-09-06
  • 打赏
  • 举报
回复
数据怎么个不一样法?从第一条开始就不一样? 这个现象真是好奇怪啊

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧