例如:A表合同表t_contract  B表合同审核表t_contract_audit。两个表根据contract_id关联。且一条合同有多条审核记录。求:A.合同状态、B.最新审核记录结果。

简单:A 1--key--n B  ---》A.*+B.*。

方案1

A作为主表单独查询,遍历list, 查询每一个合同对应的B表,按照创建时间倒序取第一条。

性能

如果是分页查询,比如一页10条,此方案分两步,思路清晰,SQL简单,不会出现”大数据量的多表关联慢查询“。

方案2

1)处理B表,按照contract_id只保留创建时间最新的一条。(当然子查询也可以,个人认为不如inner join 好理解)

SELECT
a.*
FROM
t_contract_audit a
INNER JOIN ( SELECT contract_id, max( create_time ) create_time FROM t_contract_audit GROUP BY contract_id ) b ON a.contract_id = b.contract_id
AND a.create_time = b.create_time

2)把第一步处理结果作为R表:select A.*,R.* from A left join R on A.contract_id=R.contract_id

SELECT
h.*,r.*
FROM
t_contract h
left JOIN (SELECT a.* FROM t_contract_audit a
  INNER JOIN ( SELECT contract_id, max( create_time ) create_time FROM t_contract_audit
  GROUP BY contract_id ) b ON a.contract_id = b.contract_id
  AND a.create_time = b.create_time
) r
ON h.contract_id = r.contract_id
where h.sale_id=2702
and h.contract_status IN (8,9)
order by h.create_time desc

性能

一条SQL搞定,有一定SQL复杂度,且如果表数量级大,有风险!最好自己在从库测试一下性能。

A left join B B表有多条记录,max(create_time)取最新一条的更多相关文章

  1. sql单表中某一字段重复,取最近3条或几条数据

    order by a.uid,a.id; sql查询语句,针对需求:一个表中某一字段是有重复的数据,针对该字段相同的值只取最近的3条或要求的几条: --记录铭心!

  2. Sql语句 表中相同的记录(某个字段)只显示一条,按照时间排序显示最大或最小

    原始表数据:

  3. SQL查找TCar表中同一辆车前后两条记录的CarId,两条记录中有多个字段值一样

    查询同一个表中某一字段值相同的记录 select * from 表名 where 字段 in(select 字段 from 表名 group by 字段 having count(1)>1) s ...

  4. Left Join B表,只取B表一条记录

    --用OUTER APPLY select b.* FROM a表 a OUTER APPLY () * from b表 WHERE [Name] = a.[AName] ORDER BY BNo d ...

  5. SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)

    SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表) swap_join_inputs是针对哈希连接的hint,它的含义 ...

  6. hive join 优化 --小表join大表

    1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...

  7. SQL Join连接大小表在前在后的重要性(小表在前提高执行效率)

    引用地址:https://blog.csdn.net/qq_30349961/article/details/82662550 http://blog.sina.com.cn/s/blog_6ff05 ...

  8. MySQL select join on 连表查询和自连接查询

    连表查询 JOIN ON 操作 描述 inner join 只返回匹配的值 right join 会从右表中返回所有的值, 即使左表中没有匹配 left join 会从左表中返回所有的值, 即使右表中 ...

  9. Oracle-left join两表关联只取B表匹配到的第一条记录【over partition by(分组后对组内数据排序)】

    背景:  A表.B表两表关联,关联出来的结果里B表有不止一条,需求是只要B表结果中的某一条(按某字段排序) 经过百度,发现 row_number() over(partition by a order ...

  10. 从mysql数据表中随机取出一条记录

    核心查找数据表代码: ; //此处的1就是取出数据的条数 但这样取数据网上有人说效率非常差的,那么要如何改进呢 搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据. S ...

随机推荐

  1. parser.add_argument()用法——命令行选项、参数和子命令解析器

    argparse是一个Python模块:命令行选项.参数和子命令解析器.通过使用这种方法,可以在使用 1.argparse简介: argparse 模块是 Python 内置的一个用于命令项选项与参数 ...

  2. Flask 之SocketIO库实现绘图表

    Flask 默认提供了针对WebSocket的支持插件from flask_socketio import SocketIO 直接通过pip命令安装即可导入使用,前端也需要引入socketIO库文件, ...

  3. C/C++ 提权与强制卸载DLL

    权限提升 #include <Windows.h> #include <stdio.h> BOOL SetPrivilege(LPCTSTR lpszPrivilege, BO ...

  4. Python实现栈、队列、双端队列

    栈的实现 class Stack(): def __init__(self): self.items = [] def push(self, item): self.items.append(item ...

  5. 7、后端学习规划:PHP学习 - 学习规划系列文章

    PHP在其阵营中被称为世界上最好的编程语言.笔者在学习了其一些框架后也有一定的经验,当时主要根据其框架进行的开发.对于PHP来说,在编程排行榜上也是有名的存在,现在还有一些网站应用也是用的PHP进行的 ...

  6. 曝iPhone 15系列将于9月13日发布 9月22日发售:7大升级、或售5999元起

    按照往年惯例,新款iPhone将于9月中下旬(第三周)与大家见面.9to5Mac今日带来了新款iPhone的最新消息--iPhone 15系列将于9月13日发布,9月22日正式发售. 9to5Mac从 ...

  7. Hadoop-Operation category READ is not supported in state standby 故障解决

    在查询hdfs时或者执行程序向hdfs写入数据时遇到报错:Operation category READ is not supported in state standby 意思是:该主机状态为待机, ...

  8. [Elasticsearch] Elasticsearch 启动访问报错问题

    Elasticsearch 启动访问报错问题 产生的问题与解决方案 环境:Windows 10 ES 版本:8.12.0 现象: 双击 elasticsearch.bat 文件启动后,访问 http: ...

  9. 开源.NetCore通用工具库Xmtool使用连载 - 散列算法篇

    [Github源码] <上一篇>详细介绍了Xmtool工具库中的加解密类库,今天我们继续为大家介绍其中的散列算法类库. 散列算法在某些特殊场景也可以当做加密方法使用:其特点是不可逆,同一内 ...

  10. 程序员减少BUG的两个小妙招!

    原创:陶朱公Boy(微信公众号ID:taozhugongboy),欢迎分享,转载请保留出处. ​ 点评: 我们说衡量一个程序员水平的高低往往有很多因素,但有一个因素至关重要即代码质量. 如果程序员写的 ...