大神的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 字段,就是行號,它是按照排序後的順序排列的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.