Oracle 多行合并一行 方法

假如有如下表,其中各個i值對應的行數是不定的?

Sql代碼 ?
  1. SQL>?select?*?from?t;??
  2. ??
  3. ?????????I?A??????????D??
  4. ----------?----------?-------------------??
  5. ?????????1?b??????????2008-03-27?10:55:42??
  6. ?????????1?a??????????2008-03-27?10:55:46??
  7. ?????????1?d??????????2008-03-27?10:55:30??
  8. ?????????2?z??????????2008-03-27?10:55:55??
  9. ?????????2?t??????????2008-03-27?10:55:59??
  10. ??
  11. ---?要獲得如下結果,注意字符串需要按照D列的時間排序:??
  12. ??
  13. 1??d,b,a??
  14. 2??z,t??



這是一個比較典型的行列轉換,有好幾種實現方法?

1.自定義函數實現?

Sql代碼??
  1. create?or?replace?function?my_concat(n?number)??
  2. return?varchar2??
  3. is??
  4. ?type?typ_cursor?is?ref?cursor;??
  5. ?v_cursor?typ_cursor;??
  6. ?v_temp?varchar2(10);??
  7. ?v_result?varchar2(4000):=?'';??
  8. ?v_sql?varchar2(200);??
  9. begin??
  10. ?v_sql?:=?'select?a?from?t?where?i='?||?n?||'?order?by?d';??
  11. ?open?v_cursor?for?v_sql;??
  12. ?loop??
  13. ????fetch?v_cursor?into?v_temp;??
  14. ????exit?when?v_cursor%notfound;??
  15. ????v_result?:=?v_result?||','?||?v_temp;??
  16. ?end?loop;??
  17. ?return?substr(v_result,2);??
  18. end;??
  19. ??
  20. SQL>?select?i,my_concat(i)?from?t?group?by?i;??
  21. ??
  22. ?????????I?MY_CONCAT(I)??
  23. ----------?--------------------??
  24. ?????????1?d,b,a??
  25. ?????????2?z,t??



雖然這種方式可以實現需求,但是如果表t的數據量很大,i的值又很多的情況下,因為針對每個i值都要執行一句select,掃描和排序的次數和i的值成正比,性能會非常差。?

2.使用sys_connect_by_path?

Sql代碼??
  1. select?i,ltrim(max(sys_connect_by_path(a,',')),',')?a??
  2. from??
  3. (??
  4. select?i,a,d,min(d)?over(partition?by?i)?d_min,??
  5. (row_number()?over(order?by?i,d))+(dense_rank()?over?(order?by?i))?numid??
  6. from?t??
  7. )??
  8. start?with?d=d_min?connect?by?numid-1=prior?numid??
  9. group?by?i;??


從執行計劃上來看,這種方式只需要掃描兩次表,比自定義函數的方法,效率要高很多,尤其是表中數據量較大的時候:?
?
3.使用wm_sys.wm_concat?
這個函數也可以實現類似的行列轉換需求,但是似乎沒有辦法做到直接根據另外一列排序,所以需要先通過子查詢或者臨時表排好序:?

Sql代碼??
  1. SQL>?select?i,wmsys.wm_concat(a)?from?t?group?by?i;??
  2. ??
  3. ?????????I?WMSYS.WM_CONCAT(A)??
  4. ----------?--------------------??
  5. ?????????1?b,a,d??
  6. ?????????2?z,t??
  7. ??
  8. SQL>?select?i,wmsys.wm_concat(a)??
  9. ??2??from??
  10. ??3??(select?*?from?t?order?by?i,d)??
  11. ??4??group?by?i;??
  12. ??
  13. ?????????I?WMSYS.WM_CONCAT(A)??
  14. ----------?--------------------??
  15. ?????????1?d,b,a??
  16. ?????????2?z,t??


執行計劃上看,只需要做一次表掃描就可以了,但是這個函數是加密過的,執行計劃并不能顯示函數內部的操作。
?

轉載于:https://www.cnblogs.com/rongfengliang/p/3867826.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273648.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273648.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273648.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker 簡單入門(一)

Docker 簡介 Docker是一個開源的容器引擎,它有助于更快地交付應。Docker可將應用程序和基礎設施層隔離,并且能將基礎設施當作程序-樣進行管理。使用Docker,可更快地打包、測試以及部署應用程序,并可以縮短從編寫到部署運行代碼的周期。 Docke…

PDF解決方案(2)--文件轉PDF

相關專題鏈接: PDF解決方案(1)--文件上傳 PDF解決方案(2)--文件轉PDF PDF解決方案(3)--PDF轉SWF PDF解決方案(4)--在線瀏覽 前言:上一篇中講到的文件上傳&…

Docker 常用命令(二)

Docker 鏡像常用命令 搜索鏡像 可使用 docker search 命令搜索存放在 Docker Hub 中的鏡像。例如: docker search java 執行該命令后, Docker 就會在 Docker Hub 中搜索含有 java 這個關鍵詞的鏡像倉庫。執行該命令后,可看到類似于如下的表格…

Docker 使用Dockerfile構建Docker(三)

Dockerfile 簡單使用 先來編寫一個最簡單的 Dockerfile。 例如&#xff1a; FROM nginx RUN echo <h1>使用Dockerfile構建鏡像</h1> > /usr/share/nginx/html/index.html 該 Dockerfile 非常簡單&#xff0c;其中的 FORM 、 RUN 都是 Dockerfile 的指令。 FROM …

網絡流之最大流問題

Reference&#xff1a; http://blog.csdn.net/rrerre/article/details/6751520 http://blog.csdn.net/y990041769/article/details/21026445 http://www.nocow.cn/index.php/Translate:USACO/NetworkFlow 最大流Edmonds_Karp算法模板&#xff1a; EK算法即增廣路算法。 最大流最…

delphi讀取excel

簡單的例子 1 procedure TForm1.Button1Click(Sender: TObject);2 var3 ExcelApp,MyWorkBook: OLEVariant;4 begin5 opendialog1.Filter:Microsoft Excel Workbook (*.xls)|*.XLS|; 6 edit2.Text : sheet1;7 if opendialog1.Execute then8 begin9 edit1.Text:o…

Docker-compose 常用命令及網絡設置(五)

Docker Compose 常用命令 build 構建或重新構建服務。服務被構建后將會以 project_service的形式標記,例如:comoretest db。help 査看指定命令的幫助文檔,該命令非常實用。 docker-compose所有命令的幫助文檔都可通過該命令查看。 docker-compose he lp COMMAND 示例 docker-co…

淺談 trie樹 及其實現

定義&#xff1a;又稱字典樹&#xff0c;單詞查找樹或者前綴樹&#xff0c;是一種用于快速檢索的多叉樹結構&#xff0c; 如英文字母的字典樹是一個26叉樹&#xff0c;數字的字典樹是一個10叉樹。 核心思想&#xff1a;是空間換時間.利用字符串的公共前綴來降低查詢時間的開銷以…

Docker-compose 安裝與基本使用(四)

安裝 Docker-Compose Compose有多種安裝方式,例如通過 shell, pip以及將 Compose作為容器安裝等。本次安裝以Shell 為主。 通過以下命令自動下載并安裝適應系統版本的 Compose: curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(un…

如何開始DDD(完)

連續寫了兩篇文章&#xff0c;這一篇我想是序的完結篇了。結合用戶注冊的例子再將他簡單豐富一下。在這里只添加一個簡單需求&#xff0c;就是用戶注冊成功后給用戶發一封郵件。補充一下之前的代碼 public class DomainService {public void Register(User user){if (_userRepo…

git pull 報錯:Untracked Fles Preventing Merge

場景 使用 git pull 命令更新報錯解決 找到對應的文件刪除后重新打開項目。

關于string,我今天科普的

今天下午朋友討論組上討論一個關于string的問題&#xff0c;問題是這樣的&#xff0c;string a"aaa";string ba;a"bbb",為什么測試b的值不改變&#xff1f;之前我看過一個文章&#xff0c;知道肯定不相等&#xff0c;因為引用地址的一系列問題&#xff0c;…

git pull 報錯:The following untracked working tree files would be overwritten by merge

場景 使用 git pull 命令更新報錯 Updating d652d1c..fa05549 error: The following untracked working tree files would be overwritten by merge:.idea/encodings.xmlPlease move or remove them before you can merge. Aborting 解決 使用 git clean -d -fx 命令即可。

SpringBoot 配置多數據源

項目Git地址&#xff1a;SpringBoot 配置多數據源&#xff1a;Jacob-multi-data-source 準備工作 準備兩個數據庫(此模塊中兩個數據庫一個為本地 一個為遠程&#xff0c;本地為主&#xff0c;遠程為從)。然后建表。 #本地庫 CREATE TABLE username (id bigint(11) NOT NULL AUT…

HDU 2912

直線關于球的多次反射&#xff0c;求最后一次反射點 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath>using namespace std; const double inf1e10; const double eps1e-8; struct point {doub…

EMVTag系列3《持卡人基本信息數據》

9F61 持卡人證件號 L&#xff1a;2–26 R&#xff08;需求&#xff09;&#xff1a;數據應存在&#xff0c;在讀應用數據過程中&#xff0c;終端不檢查&#xff1b; (PBOC2.0第五部分中規定)芯片中持卡人姓名 5F20與持卡人姓名擴展9F0B只能使用一個&#xff0c;另一個必須不…

BindingException: Parameter 'XXX' not found. Available parameters are [collection, list]

應業務需求&#xff0c;需要使用到MQ進行數據上傳和下發。傳遞格式為JSON,服務那邊下發JSON數組&#xff0c;接收端將JSON數組轉換成List集合&#xff0c;調用Mybatis-plus批量添加saveBatch()。提示字段未找到... org.apache.ibatis.exceptions.PersistenceException: ### Er…

JDK 8 新特性 之 default關鍵字

前言 Jdk1.8之前的接口中只聲明方法&#xff0c;方法具體實現應在子類中進行。Jdk1.8打破了這樣的用法&#xff1a;接口中可以實現具體的方法體&#xff0c;只需要加上關鍵字static或者default修飾即可。 default關鍵字 public interface UserService {//自定義方法void getUse…

headroom.js插件使用方法

1.什么是headroom.js&#xff1f; headroom是用純Javascript寫的插件&#xff0c;用來隱藏和展示頁面元素&#xff0c;從而為頁面留下更多空間。比如使用headroom能使導航欄當頁面下滾時消失&#xff0c;當頁面上滾時候又出現。&#xff08;查看效果&#xff09; 2.工作原理 通…

JDK 8 新特性 之 方法引用

概述 方法引用&#xff1a;當要傳遞給Lambda體的操作&#xff0c;已經有實現的方法了&#xff0c;就可以使用方法引用方法引用&#xff1a;在Lambda的基礎上進一步的簡化。換句話說&#xff0c;方法引用就是Lambda表達式&#xff0c;也就是函數式接口的一個實例&#xff0c;通過…