2010-11-09 54 views
0

我有问题,这个查询转换SQL服务器递归到Oracle 10g

DECLARE @INPUT INT 
SET  @INPUT = 12345 

; 
WITH ABCD(SEQ, X, Y) 
AS 
(
    SELECT 1, 
      @INPUT % 10, 
      @INPUT/10 

    UNION ALL 

    SELECT SEQ + 1, 
      Y % 10, 
      Y/10 
    FROM ABCD 
    WHERE X > 0 OR Y > 0 
) 
SELECT * 
FROM ABCD 
ORDER BY SEQ 

这个查询会产生这样的

alt text

我想这个转换到Oracle 10g(必须为10g有效)

谢谢

+1

Oracle直到11gR2才得到递归WITH支持;您必须使用Oracle的本地分层/递归语法:'CONNECT BY' – 2010-11-09 02:08:57

+0

只要结果相同,就可以了:)感谢您的回应:) – tsurahman 2010-11-09 02:12:36

回答

2

我骗了一点,依靠字符串解析而不是数学运算来计算X. 但是像这样的东西似乎工作

编辑:忘记第6行。我也删除了字符串作弊

with t as (
    select 12345 col1 from dual 
) 
select level seq, 
     trunc((col1 - 
       power(10,level) * trunc(col1/(power(10,level))))/
      power(10,level-1)) x, 
     trunc(col1/(power(10,level))) y 
    from t 
connect by level <= length(col1)+1 
/

SQL> ed 
Wrote file afiedt.buf 

    1 with t as (
    2 select 12345 col1 from dual 
    3 ) 
    4 select level seq, 
    5   trunc((col1 - 
    6    power(10,level) * trunc(col1/(power(10,level))))/
    7    power(10,level-1)) x, 
    8   trunc(col1/(power(10,level))) y 
    9 from t 
10* connect by level <= length(col1)+1 
SQL>/

     SEQ   X   Y 
---------- ---------- ---------- 
     1   5  1234 
     2   4  123 
     3   3   12 
     4   2   1 
     5   1   0 
     6   0   0 

6 rows selected. 
+0

感谢您的回应:) +1为您的答案。但是,第六级/序列在哪里? – tsurahman 2010-11-09 03:10:47

+0

@tsurahman - 修复了第六个问题和字符串作弊的问题。 – 2010-11-09 03:28:50