求两层套嵌值传递的写法

桃花岛黄岛主 2016-08-09 10:19:08
需求:找某个表的里按时间排序最大时间前每五条记录的值

全量找 时候,效率太低,数据有好多年的沉淀。
所以我想在SELECT里直接取,但需要用到两层套嵌,

select (select * from (select * from dual a where a.dummy = b.dummy)) t
from dual b


这样b表的值 是传到子查询里的,
所以问问满足我的需求有什么其他的好办法吗
...全文
1012 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼W 2016-08-23
  • 打赏
  • 举报
回复
刚休假回来。没太明白你的意思 如果从2000多万条记录中取20多万,1%左右,走索引不一定比全表扫描更优化 这种情况下按时间分区可能是最好的选择
liuzhe_521 2016-08-09
  • 打赏
  • 举报
回复
引用 5 楼 wang123kui 的回复:
而且五天并不是指自然日 ,是指日期最近的第五条记录,可能会的缺失的日期
日期最近的第五条记录 是第五条记录吗,上面你说是最近5天的值,再看一楼你的代码,一个查询作为标量子查询难道返回的不是一个值吗,而是一个集合?
liuzhe_521 2016-08-09
  • 打赏
  • 举报
回复
把你分析函数的写法贴一下,看下大致结构,表名和字段名可以用化名。
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
表结构不方便贴,我的想法就是走索引,但是正如我的主贴里说的,需要用到套嵌的子查询, 参数传不进去, 你的走索引是什么思路,可以探讨一下
liuzhe_521 2016-08-09
  • 打赏
  • 举报
回复
使用索引 2千多万数据 不会太慢 索引和建表情况大致贴一下
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
引用 9 楼 liuzhe_521 的回复:
索引情况呢 ?
日期与代码的联合索引
liuzhe_521 2016-08-09
  • 打赏
  • 举报
回复
索引情况呢 ?
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
引用 7 楼 js14982 的回复:
想其他办法呗,比如自连接查询
我就是想不出其他办法啊,你有什么办法,全量找是可以满足的,不过太慢了,我想找个效率高点的方法
js14982 2016-08-09
  • 打赏
  • 举报
回复
想其他办法呗,比如自连接查询
ghx287524027 2016-08-09
  • 打赏
  • 举报
回复
暂时还没发现什么好办法,毕竟数据量在那呢,如果以后经常有这种需求的话,建议对表分区吧。。。。。
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
而且五天并不是指自然日 ,是指日期最近的第五条记录,可能会的缺失的日期
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
表中大概有两千多万数据,有将近二十年的积累,我只要找最大日期的值 ,最新五天的值 ,结果大概只有二十万记录, 如果全量用分析函数,太慢了,比直接在SELECT中取慢太多了
ghx287524027 2016-08-09
  • 打赏
  • 举报
回复
表结构什么样的,数据量有多大?
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
是不支持了,所以想问问有没有其他的方法实现 了
ghx287524027 2016-08-09
  • 打赏
  • 举报
回复
11g中已经不支持子查询中嵌套外层表了吧
liuzhe_521 2016-08-09
  • 打赏
  • 举报
回复
引用 21 楼 wang123kui 的回复:
[quote=引用 20 楼 liuzhe_521 的回复:] 这样改写试试(col_代码,col_日期 上复合索引): --原代码基本结构: select * from (select row_number() over(partition by col_代码 order by col_日期) rn, a.* from tab a) where rn = 5; --改写: select * from tab a, (select rid from (select row_number() over(partition by col_代码 order by col_日期) rn, rowid rid from tab a) where rn = 5) b where a.rowid = b.rid;
这个方法没什么优化吧,还是要全量分给排序[/quote] 试试吧,应该会比以前写法好些
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
引用 20 楼 liuzhe_521 的回复:
这样改写试试(col_代码,col_日期 上复合索引): --原代码基本结构: select * from (select row_number() over(partition by col_代码 order by col_日期) rn, a.* from tab a) where rn = 5; --改写: select * from tab a, (select rid from (select row_number() over(partition by col_代码 order by col_日期) rn, rowid rid from tab a) where rn = 5) b where a.rowid = b.rid;
这个方法没什么优化吧,还是要全量分给排序
liuzhe_521 2016-08-09
  • 打赏
  • 举报
回复
这样改写试试(col_代码,col_日期 上复合索引): --原代码基本结构: select * from (select row_number() over(partition by col_代码 order by col_日期) rn, a.* from tab a) where rn = 5; --改写: select * from tab a, (select rid from (select row_number() over(partition by col_代码 order by col_日期) rn, rowid rid from tab a) where rn = 5) b where a.rowid = b.rid;
桃花岛黄岛主 2016-08-09
  • 打赏
  • 举报
回复
代码值有五十多万,只需要取其二十多万, 如何优化
liuzhe_521 2016-08-09
  • 打赏
  • 举报
回复
引用 17 楼 wang123kui 的回复:
[quote=引用 16 楼 liuzhe_521 的回复:] [quote=引用 15 楼 wang123kui 的回复:] [quote=引用 14 楼 liuzhe_521 的回复:] [quote=引用 5 楼 wang123kui 的回复:] 而且五天并不是指自然日 ,是指日期最近的第五条记录,可能会的缺失的日期
日期最近的第五条记录 是第五条记录吗,上面你说是最近5天的值,再看一楼你的代码,一个查询作为标量子查询难道返回的不是一个值吗,而是一个集合?[/quote] 是的,就是第五天,一楼的代码是不能执行的,会报错 最开始的办法,是用ROW_NUMBER() over(parition by order by ) 这种,然后用行列转换,取值为5的 但这种分组排序,每组都要排上万个序号,而我只要取一个字,所以这样效率很差 我是想有没有办法 直接走索引取第5个,在SELECT 子句中,这样的效率会高很多[/quote] 对什么分组,是上面你说的【代码】 字段吗?[/quote] 是的[/quote] 可以优化。 【代码】字段的distinct值大概有多少
加载更多回复(3)

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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