String sql="
witht1 as(select distinct(V.EK_TYPE),V.CREATED,VA.DESC_TEXT,V.EK_PAR_ID as pid,"
+" decode(V.EK_URL_01,null,null,VA.DESC_TEXT || V.EK_URL_01) as link1,"
+"decode(V.EK_URL_02,null,null,VA.DESC_TEXT || V.EK_URL_02) as link2,"
+"decode(V.EK_URL_03,null,null,VA.DESC_TEXT || V.EK_URL_03) as link3,"
+"decode(V.EK_URL_04,null,null,VA.DESC_TEXT || V.EK_URL_04) as link4,"
+"decode(V.EK_URL_05,null,null,VA.DESC_TEXT || V.EK_URL_05) as link5 "
+" from siebel.CX_ST_GENE_VIEW V LEFT JOIN siebel.S_LST_OF_VAL VA ON V.X_ATTRIB_01 = VA.VAL AND VA.type = 'EK_ATT_ROUTE' where V.EK_PAR_ID='"+parid+"' order by V.Created desc) ,"
+"
t2 as(
select row_number() over (partition by eK_type order by created desc) r,t1.* from t1)"
+" select * from t2 where r=1 and t2.EK_TYPE is not null";
这种with 的用法我还是第一次见到,大神就是大神,下面来一一总结一下这几个关键的句子吧:
1.with t1 as(select 语句),t2 as(select 语句)
select * from t2 where r=1 and t2.EK_TYPE is not null , 解释: 这里with 就是连接两张表,最后一个select 语句就是从t1,和t2里面查询数据,相当于嵌套查询,只是写法更加灵活
3. select row_number() over (partition by eK_type order by created desc) r,t1.* from t1 解释: 这句代码太神奇了, row_number() over (partition by 字段1 order by 字段2 desc) ,通过字段1 分组,再通过字段2排序 这里的神奇之处在于,它是按分组后组内排序,也就是每一组里面, 都有排序,这样刚好满足我的需求,我只要通过选取每一组的第一条数据就可以拿到每个图片类型最新的那条数据,因为我是按照时间倒序排列的。代码如下: select * from t2 where r=1 and t2.EK_TYPE is not null r=1 就是每组的第一条数据啦,因为分组后,多了一个r 字段,就是行号,它是按照排序后的顺序排列的。