2016-06-11 23 views
0

Ich habe ein Problem mit einer rekursiven Abfrage in Oracle.SQL rekursive Abfrage (Oracle)

Ich bin derzeit in der Lage, das Ergebnis zu erhalten, indem CTE in SQL Server verwendet, aber ich muss den Code für Oracle anpassen.

Der Code Ich verwende ist

WITH n(portefeuille, client, level, opcvm, ca, iter) AS 
(
    SELECT 
     portefeuille, client, 0 as level, opcvm, ca, 
     CAST(',' + CAST(portefeuille AS varchar) + ',' AS varchar) AS iter 
    FROM 
     dbo.chiffres 
    WHERE 
     opcvm IS NULL 

    UNION ALL 

    SELECT 
     m.portefeuille, n.client, n.level+1, m.opcvm, m.ca + n.ca, 
     CAST(iter + CAST(m.portefeuille AS varchar) + ',' AS varchar) AS iter 
    FROM 
     dbo.chiffres AS m 
    INNER JOIN 
     n ON n.portefeuille = m.opcvm 
) 
SELECT DISTINCT 
    n.level, n.client, n.portefeuille, n.ca , n.opcvm, iter, 
    (SELECT COUNT(*) 
    FROM n T1 
    WHERE T1.iter LIKE '%,' + CAST(n.portefeuille AS varchar) + ',%') - 1 AS Subordinates 
FROM 
    n, dbo.chiffres c 
WHERE 
    ((SELECT COUNT(*) 
     FROM n T1 
     WHERE T1.iter LIKE '%,' + CAST(n.portefeuille AS varchar) + ',%') - 1) = 0 
ORDER BY 
    level 

Ich denke, dass ich ‚verbinden, indem Sie‘ in Oracle verwenden, aber ich bin mir nicht sicher, wie es zu benutzen.

In der Tat, in meinem endgültigen Code, ich würde ein "Select ....." anstelle der Tabelle dbo.chiffres verwenden.

Das Ergebnis dieser "wählen ...." ist (just ein exemple)

Client | portefeuille | CA | OPCVM 
31054 | 024   | 140   | NULL 
104900 | 034    |200   | 024 
31054 | 006    | 10   | NULL 

Und das Endergebnis, das ich will

level | Client | portefeuille | CA | iter | subordinates 
0  | 31054 | 034   | 340   | ,024,034,  |0 
1  | 31054 | 006   | 10   | ,006,   |0 
+0

CTEs funktionieren in Oracle (es wird in der Dokumentation als Unterabfrage-Factoring-Klausel bezeichnet) - Sie sollten es relativ einfach portieren können. Benennen Sie "level" in "lvl" um - "level" ist ein Schlüsselwort, das in hierarchischen Abfragen verwendet wird und nicht als Alias ​​verwendet werden kann. – MT0

+0

Vielen Dank für Ihre Antwort. Ich denke, ich habe diese Lösung versucht, aber ich habe den Fehler 'SELECT Keyword fehlt'. In der Tat ist mein Problem ein wenig komplizierter, weil ich keine Tabelle dbo.chiffres habe, sondern stattdessen ein 'select ....'. Kann dies die Ursache des Problems sein? – Lamia

+0

Ich habe meinem Beitrag einige Details hinzugefügt, um mehr über mein Problem zu erfahren. – Lamia

Antwort

1

So etwas ist:

WITH n(portefeuille, client, lvl, opcvm, ca, iter) AS (
    SELECT portefeuille, 
      client, 
      0, 
      opcvm, 
      ca, 
      ',' || portefeuille 
    FROM dbo.chiffres 
    WHERE opcvm is null 
UNION ALL 
    SELECT m.portefeuille, 
      n.client, 
      n.lvl+1, 
      m.opcvm, 
      m.ca+n.ca, 
      iter || m.portefeuille || ',' 
FROM  dbo.chiffres m 
      inner join n 
      on n.portefeuille = m.opcvm 
) 
select distinct 
     n.lvl, 
     n.client, 
     n.portefeuille, 
     n.ca , 
     n.opcvm, 
     iter, 
     (SELECT COUNT(*) 
       FROM n T1 
       WHERE T1.iter LIKE '%,' || n.portefeuille || ',%' 
     ) - 1 AS Subordinates 
from n, 
     dbo.chiffres c 
where ((SELECT COUNT(*) FROM n T1 WHERE T1.iter LIKE '%,' || n.portefeuille || ',%') - 1) = 0 
order by lvl 

Ich habe keine Tabellen, um es zu testen, aber ich habe

  • umbenannt level zu lvl (wie level ist ein Schlüsselwort in hierarchischen Abfragen verwendet).
  • Der Zeichenfolge-Verkettungsoperator ist || in Oracle lieber als +.
  • Alle Abgüsse entfernt - ich glaube nicht, dass Sie sie brauchen.