程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 使用SQL將數組轉換為矩陣

使用SQL將數組轉換為矩陣

編輯:關於MYSQL數據庫

 

使用SQL數組轉換為矩陣 ,那麼一個矩陣怎麼保存呢?

1     | 1 2 3 (ROW) 2  ---+------- 3   1 | 1 2 3 4   2 | 4 5 6 5   3 | 7 8 9 6 (COL)

通常的做法是保存成一個矩陣數組如下:

01          R          C          V 02 ---------- ---------- ---------- 03          1          1          1 04          1          2          2 05          1          3          3 06          2          1          4 07          2          2          5 08          2          3          6 09          3          1          7 10          3          2          8 11          3          3          9

但是怎麼轉換回去呢?這個也很簡單,估計大學C語言教材裡就能找到例子,這裡也不多說了,那麼如何用SQL來解決這個問題呢?Thinking In Sets:

首先是Oracle的例子:

01 with array as ( 02     select 1 as r, 1 as c,1 as v from dual  union all 03     select 1,2,2 from dual  union all 04     select 1,3,3 from dual  union all 05     select 2,1,4 from dual  union all 06     select 2,2,5 from dual  union all 07     select 2,3,6 from dual  union all 08     select 3,1,7 from dual  union all 09     select 3,2,8 from dual  union all 10     select 3,3,9 from dual 11 ) 12 select SYS_CONNECT_BY_PATH( v, ' ') matrix 13 from array 14 where level=(select count(distinct(c)) from array) 15 start with c=1 16 connect by prior r=r  17        and prior c=c-1 18 order by r ; 1 MATRIX 2 -------- 3  1 2 3 4  4 5 6 5  7 8 9

我們使用了Oracle的 connect by 進行遞歸層次查詢獲得結果:

再來看看SQL Server的例子(需要SQL Server 2005或以上版本):

01 with array as ( 02     select 1 as r, 1 as c,1 as union all 03     select 1,2,2  union all 04     select 1,3,3  union all 05     select 2,1,4  union all 06     select 2,2,5  union all 07     select 2,3,6  union all 08     select 3,1,7  union all 09     select 3,2,8  union all 10     select 3,3,9  11 ), 12 cte as 13   select 1 as lvl,r,c,cast(v as varchar(50)) as line  14     from array where c=1 15   union all 16   select lvl+1, a.r, a.c, cast(c.line+' '+cast(a.v as varchar(10)) as varchar(50))  17     from cte c, array a 18     where c.r=a.r and a.c=c.c+1 19 ) 20 select line as matrix from cte 21 where lvl=(select COUNT(distinct(c)) from array) 22 order by r; 1 matrix 2 -------- 3 1 2 3 4 4 5 6 5 7 8 9

SQL Server 借助CTE語法實現了遞歸層次查詢。

 

算法很簡單:

第一步,找出c=1的所有數據,也就是第一列上的數據

第二步,在當前數據的同一行上(Oracle:prior r=r / SQL Server:c.r=a.r)尋找下一個數據(Oracle:prior c=c-1 / SQL Server:a.c=c.c+1)

遞歸調用第二步,直到找不到下一個數據為止。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved