大神的SQL语句
总结一下昨天的工作内容,需求是,从数据库获取图片的路径等信息,用轮播的形式展示在界面上,展示层已经做好了,要做的取出图片的路径等信息。 我困在了图片的获取上,因为数据库里面的图片信息非常多,要去过滤出最新的某个类型的图片,于是,岳总岳大神来了,他写了一个sql语句,惊呆了小伙伴,上代码:
String sql="with t1 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里面查询数据,相当于嵌套查询,只是写法更加灵活
2.decode(V.EK_URL_01,null,null,VA.DESC_TEXT || V.EK_URL_01) as link1,decode 的用法,
解释:这里的意思是 如果V.EK_URL_01的值为null ,则 link1这个字段的值就是 null ,否则值就是VA.DESC_TEXT || V.EK_URL_01
这里面又涉及到 连接字段,“||” 这个符号就是连接符号,意思是, VA.DESC_TEXT 加上 V.EK_URL_01 才是link1的值
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 字段,就是行号,它是按照排序后的顺序排列的。
String sql="with t1 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里面查询数据,相当于嵌套查询,只是写法更加灵活
2.decode(V.EK_URL_01,null,null,VA.DESC_TEXT || V.EK_URL_01) as link1,decode 的用法,
解释:这里的意思是 如果V.EK_URL_01的值为null ,则 link1这个字段的值就是 null ,否则值就是VA.DESC_TEXT || V.EK_URL_01
这里面又涉及到 连接字段,“||” 这个符号就是连接符号,意思是, VA.DESC_TEXT 加上 V.EK_URL_01 才是link1的值
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 字段,就是行号,它是按照排序后的顺序排列的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.