序:
我后面那哥们要我给他在一张表中回写update记录,就是不同的人提交了只选取最新的节点信息,往那张表中插入最新的就可以了。我给他增加了这个功能,现在他又给了我一个新到的需求。
需求
找到存放节点信息的表,导出最新的节点名称和节点的id给他。
详细需求一步一步分析
先看创建表的sql
1 | CREATE TABLE [dbo].[lbpm_audit_note]( |
写sql之前
一开始,我是根据系统打断点,找到发sql的地方,找到关键性的sql,但是由于是hql语句,所以我又得去找表与实体类之间的映射关系,找到hibernate的配置文件之后,找到表,直接去sql server管理器中select * from 那张表 ,理清思路之后,明白了我要做的事.
真实的sql需求是
- 因为一个流程中 fd_process_id 是一样的,也就是说着一列是重复的,当然也可以是不重复的
- 让我找到最新的节点名称,这个好办,因为审批流程是按时间顺序来的,根据那个hql语句也能看出来。
- 但是问题就是在这里 ,我要找到所以得最新的
我的分析过程
1
2
3
4select top 1 fd_id , fd_fact_node_name from
lbpm_audit_note where fd_process_id = '158a91b47100e1c93ffb89140c583fd2' and
fd_action_key is not null
order by fd_create_time desc ;
等我一步一步开始搜索全部的时候问题就来了1
2
3
4
5select fd_id , fd_fact_node_name from
lbpm_audit_note where fd_process_id
in (select fd_process_id from lbpm_audit_note group by fd_process_id having count(fd_process_id) > 1 )
and fd_action_key is not null
order by fd_create_time desc ;
这个是我当时分析的,但是很明显这个结果不对,id一一对应但是没有只获取最新的节点1
2
3
4
5select A.fd_id , A.fd_fact_node_name from
lbpm_audit_note as A ,
(select fd_process_id ,MAX(fd_create_time) as fd from lbpm_audit_note group by fd_process_id
having count(fd_process_id) > 1)
as B where A.fd_process_id = B.fd_process_id and A.fd_action_key is not null and A.fd_create_time = B.fd
上面这个是思考半天,参考了https://blog.csdn.net/tongyiyi/article/details/5787755之后得到的答案,记录一哈.