Oracle查询问题

akane_oimo 发布于 08/13 19:23
阅读 151
收藏 0

如图所示,大佬帮帮忙

加载中
0
前端大师傅
前端大师傅

 

在下来说下怎么来做,楼主的意图是合同表和合同续期表查出合同的最新时间。一张合同对应零到多个续期,这样的话就要取右边续期的最新时间。即max renew_time。

SELECT
	a.*,
CASE
		ca.is_renew 
		WHEN 'Y' THEN
		a.renew_time 
		WHEN 'N' THEN
		ca.expire_time  ELSE NULL 
	END time 
FROM
	(
	SELECT
		c.*,
		max( ca.`agreement_id` ) agreement_id 
	FROM
		cont_info c
		LEFT JOIN cont_agreement ca ON ca.cont_id = c.cont_id 
		order by ca.renew_time desc
	) a
	LEFT JOIN cont_agreement ca ON ca.`agreement_id` = a.agreement_id


 

akane_oimo
akane_oimo
学到了,非常感谢😄
前端大师傅
前端大师傅
回复 @ID就这么长 : 不好意思,在下刚才言语重了一些。在下的意思是希望能看清楚再回答。相信这位仁兄的意图是为了帮助楼主解决问题。以免好心却帮错了。其实这个自己测试一下也就可以了。在下觉得你的目的如果是为了帮人那认真一点也是为了达成你的目的,你说呢。在下每个回答只要是知道的,都会自己建表自己作测试。因为在下知道如果你想帮助别人也要认真,至少对得住自己的目的。
I
ID就这么长
不好意思,回答误导了题主,回答已删,避免误导他人。
0
IdleMan
IdleMan

有合同肯定存在协议记录时用inner join,否则用left join但返回结果可能为空:

select case
         when b.is_renew = 'Y' then
          b.renew_time
         when b.is_renew = 'N' then
          a.expired_time
       end as 过期时间
  from cont_info a
 inner join cont_agreement b
    on a.cont_id = b.cont_id;

 

前端大师傅
前端大师傅
你这个就不对了,因为合同表和协议表是一对多,即一个合同表的con_id会有多个协议表的记录con_id。你要理解这样设计的意图。在inner join的同时要group by cont_id把所有的主表(合同)分组,而每个合同取最晚的协议时间作更新时间,再判断是否is_renew。还有请这位朋友注意业务场景,如果 is_renew是y合约表才有记录,如果为n则取的合同表所以left_join可以
返回顶部
顶部