2010-11-09 4 views
0

J'ai problème avec cette requêteConvert SQL Server récursif clause 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 

cette requête produira quelque chose comme ça

alt text

Je veux convertir en Oracle 10g (doit être valide pour 10g)

Merci

+1

Oracle n'a pas été récursive avec le support jusqu'à 11gR2; vous devez utiliser la syntaxe natif/récursive d'Oracle: 'CONNECT BY' –

+0

c'est OK tant que le résultat est le même :) merci pour votre réponse :) – tsurahman

Répondre

2

Je triche un peu pour calculer X en me basant sur l'analyse des chaînes plutôt que sur les opérations mathématiques. Mais quelque chose comme ça semble fonctionner

EDIT: Oublié la 6ème rangée. J'ai également supprimé la chaîne de caractères triche

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

merci pour votre réponse :) +1 pour votre réponse. mais, où est le 6ème niveau/séquence? – tsurahman

+0

@tsurahman - Correction du problème avec le 6ème numéro et avec la triche de chaîne. –