关于oracle数据库讨厌的自动排序问题!!很难发觉的!

whbbc 2004-05-10 07:19:14
在oracel数据库中
先看一下这条查询语句吧!
SELECT distinct BASE FROM PAY_TEMP WHERE id=45563 AND TIME LIKE '1999%' AND INSUREID = '110104541204163'
这是一条很简单的查询语句
但我发现distinct竟然把筛选出来的数据进行了自动排序(升序)
请问各位大虾,能不能不让它自动排序
group by 好像也是这样?
...全文
368 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
whbbc 2004-05-13
  • 打赏
  • 举报
回复
!!!!!!!!!!!!!!!Thanks!!!!!!!!!!!!!!!!!!
marinedalian 2004-05-12
  • 打赏
  • 举报
回复
学习
whbbc 2004-05-12
  • 打赏
  • 举报
回复
是的,oracle的内部设计就是先排序在筛选,这也正是我郁闷的地方,实在不行我就只好改程序了。明天结贴
ttoc 2004-05-12
  • 打赏
  • 举报
回复
我也很想知道答案,帮你up一下吧
snowy_howe 2004-05-12
  • 打赏
  • 举报
回复
select money from
(select min(rowid) rd,money
from test group by money) order by rd;
这样不知道行不行??
取最小的rowid,这样保证取出同样的money中先录入的记录。
然后按这个rowid升序排列取money。
需要贴主再测试一下。
dinya2003 2004-05-11
  • 打赏
  • 举报
回复
据说distinct排序是可以提高检索的性能,是这样的吗.
whbbc 2004-05-11
  • 打赏
  • 举报
回复
还不是各位大虾想得那样,我有一个函数(带两个参数X,Y)我会把筛选出来的两个数赋值给X,Y
因该是x=3373,Y=2899,但oracle自动排序了,所以值就赋反了,这个问题还不能重新排序,因为有的时候,记录集里的数据可能会是
[money] [time]
2563 200001
2563 200002
... ...
3012 200006
3012 200007
... ...
筛选出来以后就应该是小的数在前,所以,最好是去掉自动排序
时间在这里这是一个参考,我不取的。
l2g32003 2004-05-10
  • 打赏
  • 举报
回复
你是想找到第一个 money 然后再找到对应的time吧
下面的两个语句或许有用
ops$lg\lee@ora10.lg.ok >select *
2 from emp
3 where hiredate = ( select max(hiredate) from emp e2 where e2.deptno =
4 emp.deptno)
5 /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7934 MILLER CLERK 7782 23-1月 -82 1300 10

ops$lg\lee@ora10.lg.ok >select *
2 from ( select emp.*, max(hiredate) over ( partition by deptno ) max_hd
3 from emp
4 )
5 where hiredate = max_hd
6 /
comcn 2004-05-10
  • 打赏
  • 举报
回复
把rowid to_char后(可能还要再做16进制转换)再排序呢
whbbc 2004-05-10
  • 打赏
  • 举报
回复
不行,你的方法我试了。
select * from (SELECT distinct BASE FROM PAY_TEMP WHERE id=45563 AND TIME LIKE '1999%' AND INSUREID = '110104541204163') order by rowid
这个不行的
还有别的方法吗??
某鸟 2004-05-10
  • 打赏
  • 举报
回复
我是说order by rowid是否可以重新搞定“弄乱”顺序的结果呢?:)
某鸟 2004-05-10
  • 打赏
  • 举报
回复
order by rowid?
welyngj 2004-05-10
  • 打赏
  • 举报
回复
我也想知道怎么做
whbbc 2004-05-10
  • 打赏
  • 举报
回复
记录集如下:
------------------------------
[money] [time]
3373 199901
3373 199902
3373 199903
3373 199904
3373 199905
3373 199906
2899 199907
2899 199908
2899 199909
2899 199910
2899 199911
2899 199912
---------------------------------------
当筛选出数据money列后,得到:
2899
3373
因为它是默认自动排序(升序)
可我要取的值,必须不能改变顺序,也就是[money]列原先数据怎样排序,筛选出来的数据排序不变。
请赐教!!!(分不够在加)
skystar99047 2004-05-10
  • 打赏
  • 举报
回复
应该的
welyngj 2004-05-10
  • 打赏
  • 举报
回复
distinct group by都要进行排序。没有办法了,oracle是那样设计的。
gechangwei 2004-05-10
  • 打赏
  • 举报
回复
不可能。想想看,不排序去判断distinct性能的代价是否大了点?这是个基本算法问题。

17,377

社区成员

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

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