SQL> create table t(col1 varchar2(10),col2 varchar2(10));表已创建。SQL> SQL> insert into t values('001','vl1');已创建 1 行。SQL> insert into t values('001','vl2');已创建 1 行。SQL> insert into t values('001','vl3');已创建 1 行。SQL> insert into t values('002','vl1');已创建 1 行。SQL> insert into t values('002','vl2');已创建 1 行。SQL> insert into t values('002','vl3');已创建 1 行。SQL> insert into t values('002','vl4');已创建 1 行。SQL> COMMIT;提交完成。SQL> select * from t;COL1 COL2 ---------- ---------- 001 vl1 001 vl2 001 vl3 002 vl1 002 vl2 002 vl3 002 vl4已选择7行。SQL> COL COL2 FORMAT A20SQL> SELECT COL1,LTRIM(MAX(SYS_CONNECT_BY_PATH(COL2,',')),',') COL2 2 FROM 3 ( 4 SELECT COL1,COL2,MIN(COL2) OVER(PARTITION BY COL1) COL2_MIN, 5 (ROW_NUMBER() OVER(ORDER BY COL1,COL2))+(DENSE_RANK() OVER (ORDER BY COL1)) NUMID 6 FROM T 7 ) 8 START WITH COL2=COL2_MIN CONNECT BY NUMID-1=PRIOR NUMID 9 GROUP BY COL1;COL1 COL2 ---------- -------------------- 001 vl1,vl2,vl3 002 vl1,vl2,vl3,vl4
能否请boydgmx解释一下这个sql啊
TO boydgmx(梦霄) : 呵呵!跟我學的嗎?那太好了,說明我為Oracle版塊作出貢獻了!其實對於這種類似的問題有三種解決方式的,一是使用函數,這是最簡單常用的方法,二就是使用我常喜歡用的樹形遍歷(也就是你在此貼中給出的方法),三是使用一個臨時表再使用一個UPDATE即可,這種方法也比較簡單,速度快,但是此種方式隻能在缺乏層次查詢的SQL Server中使用,四是最笨的也是效率最低的方法,就是使用遊標加循環的方式。
SQL> insert into t values('001','vl1');已创建 1 行。SQL> insert into t values('001','vl2');已创建 1 行。SQL> insert into t values('001','vl3');已创建 1 行。SQL> insert into t values('002','vl1');已创建 1 行。SQL> insert into t values('002','vl2');已创建 1 行。SQL> insert into t values('002','vl3');已创建 1 行。SQL> insert into t values('002','vl4');已创建 1 行。SQL> COMMIT;提交完成。SQL> select * from t;COL1 COL2
---------- ----------
001 vl1
001 vl2
001 vl3
002 vl1
002 vl2
002 vl3
002 vl4已选择7行。SQL> COL COL2 FORMAT A20SQL> SELECT COL1,LTRIM(MAX(SYS_CONNECT_BY_PATH(COL2,',')),',') COL2
2 FROM
3 (
4 SELECT COL1,COL2,MIN(COL2) OVER(PARTITION BY COL1) COL2_MIN,
5 (ROW_NUMBER() OVER(ORDER BY COL1,COL2))+(DENSE_RANK() OVER (ORDER BY COL1)) NUMID
6 FROM T
7 )
8 START WITH COL2=COL2_MIN CONNECT BY NUMID-1=PRIOR NUMID
9 GROUP BY COL1;COL1 COL2
---------- --------------------
001 vl1,vl2,vl3
002 vl1,vl2,vl3,vl4
呵呵!跟我學的嗎?那太好了,說明我為Oracle版塊作出貢獻了!其實對於這種類似的問題有三種解決方式的,一是使用函數,這是最簡單常用的方法,二就是使用我常喜歡用的樹形遍歷(也就是你在此貼中給出的方法),三是使用一個臨時表再使用一個UPDATE即可,這種方法也比較簡單,速度快,但是此種方式隻能在缺乏層次查詢的SQL Server中使用,四是最笨的也是效率最低的方法,就是使用遊標加循環的方式。
真讓人鬱悶!!!!!!!!!