帮我优化一下这条oracle 的sql语句?谢谢大家!

xieyunchao 2008-07-15 08:41:05
SELECT *
FROM tpi_pay_amount p1
WHERE p1.paydate =
(SELECT MAX (p.paydate)
FROM tpi_pay_amount p
WHERE p.worklist_id = '402880791ad407a2011ad40a9fea0001'
AND p.paydate < (SELECT MAX (p3.paydate)
FROM tpi_pay_amount p3))
AND p1.worklist_id = '402880791ad407a2011ad40a9fea0001'

我想在表tpi_Pay_Amount中得到worklist_Id='402880791ad407a2011ad40a9fea0001'的记录集,并且在此基础上找到paydate第二大的那条记录.其中worklist_Id不是表tpi_Pay_Amount 的主键.谁能帮我写一条效率高的sql语句.谢谢.
十份感谢!!
有人说用rownum做,但是不行呀:
SELECT * FROM (
SELECT rownum rn, t.* FROM tpi_pay_amount
WHERE worklist_id = '402880791ad407a2011ad40a9fea0001'
ORDER BY paydate DESC) t
WHERE rn = 2

原因:

关于oracle子查询以及rownum的有关经验:
rownum含义解释:
1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,
  依此类推,这个伪字段可以用于限制查询返回的总行数。
2、rownum不能以任何基表的名称作为前缀。


使用方法:
SQL> select rownum,month,sell from sale where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)

rownum MONTH SELL
--------- ------ ---------
1 200001 1000

SQL> select rownum,month,sell from sale where rownum=2;(1以上都查不到记录)

没有查到记录

SQL> select rownum,month,sell from sale where rownum>5;
(由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件不成立,查不到记录)
oracle的rownum是不能等于2的!!!!!!
...全文
69 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hebo2005 2008-07-15
  • 打赏
  • 举报
回复
怎么这个贴子前两天见过的,一模一样的问题啊
oracledbalgtu 2008-07-15
  • 打赏
  • 举报
回复


需要给paydate建立一个index:

SELECT *
FROM tpi_pay_amount
WHERE paydate =
(SELECT paydate
FROM (SELECT paydate, DENSE_RANK() OVER(ORDER BY HIREDATE) RN
FROM tpi_pay_amount
WHERE worklist_id = '402880791ad407a2011ad40a9fea0001')
WHERE RN = 2);



[Quote=引用楼主 xieyunchao 的帖子:]
SELECT *
FROM tpi_pay_amount p1
WHERE p1.paydate =
(SELECT MAX (p.paydate)
FROM tpi_pay_amount p
WHERE p.worklist_id = '402880791ad407a2011ad40a9fea0001'
AND p.paydate < (SELECT MAX (p3.paydate)
FROM tpi_pay_amount p3))
AND p1.worklist_id = '402880791ad407a2011ad40a9fea0001'

我想在表tpi_Pay_Am…
[/Quote]

2,668

社区成员

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

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