目的:
根据 rid 属性,得到 A表 最大的 rtime 属性值对应的记录。
sql 1:
select * from A where rid='3636' order by rtime desc
可以得到正确的结构,其中rtime=‘2008-11’
但是当我改成如下
sql 2:
select * from A where rownum <2 and rid='3636' order by rtime desc
得到的结果竟然是rtime=‘2003-01’的记录。。。
原因如下:
sql在编译的时候,顺序是:
先进行where后面的编译,再做order by的排序,
因此,第二条sql语句是先找到rid=‘3636’的记录,并取得rownum=1即返回的第一条记录,然后再按rtime排序(此时已经没有意义,因为只得到了一条记录)。
解决办法:
1.修改sql语句:
select a.* from (select * from A where rid='3636' order by rtime desc) a where rownum <2
2.修改sql语句:----相当于全部排序
SELECT *
FROM A A1
WHERE NOT EXISTS (SELECT 1
FROM A A2
WHERE A1.RID = A2.RID
AND A1.RID = '3636'
AND A1.RTIME < A2.RTIME)
AND A1.RID = '3636';
3.在rtime上创建索引,再使用sql 2,就可以得到正确的记录了。
创建索引的语句:
create index index_name on table_name(field_name),