当前位置: 首页 > news >正文

Oracle 11g数据库与某个表的最新一笔记录进行关联

背景:最近在写Power BI的看板,而表中的数据都是上亿条记录的,各个表的关联关系非常复杂。而对于某些表,用户又只要看到最新的数据。

举个例子,比如A关联B表,正常来说看板是这样写的。

select * from a
left join b
on a.xx = b.xx

但是实际上,用户只需要B表中,按某些字段划分的最新记录。

我就写成了这样:

WITH C AS(SELECT B.*,ROW_NUMBER() OVER(PARTITION BY B.XXX,B.XXXXX ORDER BY B.INDATE DESC) AS rnFROM B )
SELECT *
FROM A
LEFT JOIN C
ON A.XX = C.XX AND C.RN = 1;

这个sql语句中用到了row_number()的窗口函数(Oracle内置函数),它根据B表中的XXX和XXXXX字段分组,然后根据B表中的INDATE进行了排序。

with c as 则是将结果集存放到内存中,建一个临时表c存储这些结果数据,然后a表直接跟c关联,c.rn = 1 就是最新的记录。

但是,由于我所在公司的数据量太大,这样跑的效率仍然很低。

于是,我改成了如下写法:

WITH c AS (SELECT b.xx,b.xxxxx,MAX(b.indate) AS indateFROM scstadmin.bGROUP BY b.xx,b.xxxxx
)
select * from a
left join b
on a.xx = b.xx 
and b.indate = (select indate from c where c.xx=b.xx and c.xxxxx= b.xxxxx);

这样写的好处是:

1.通过 WITH 子句 (c) 预先计算出每个 xx 最新的 indate,避免对整个表使用 ROW_NUMBER()。减少数据库对无用信息的计算次数,效率自然提升。

2.在主查询中将 b.indate 与子查询的最大时间进行匹配,从而仅选择最新的记录。

当然,语法优化只能优化一部分效率,最简单且有效的写法是对b表中的XX、XXXXX和indate字段做复合索引:(XX, XXXXX,INDATE DESC)。这可以极大地提高 ROW_NUMBER() 的性能。

一小段小记,希望可以帮到大家。


http://www.mrgr.cn/news/12974.html

相关文章:

  • go国内源设置
  • 16岁激活交学费银行卡需要本人实名电话卡,线下营业厅不给办,怎么办?
  • 自动化01:认识接线端子
  • docker0: iptables: No chain/target/match by that name问题解决
  • git如何将多个提交合并为一个提交
  • Linux网络
  • Maven基本使用
  • 本地化云桌面系统环境VMware horizon搭建
  • Zotero打开后所有文献及笔记都消失了
  • Spring Boot使用拦截器(Interceptor)
  • 黑神话悟空无法登录服务器怎么办
  • 数据库系统 第28节 数据库迁移 案例分析
  • iOS 苹果健康-睡眠
  • 3D工艺大师:精准助力医疗设备远程维修
  • Redis key的过期时间和永久有效
  • 2024华为性格测试机考真题丨不会有人OD机试满分结果挂在性格测试上了吧?
  • golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方法
  • Linux的log日志排查
  • 【2025校招】4399 NLP算法工程师笔试题
  • ProxySQL 读写分离配置