2017-12-10 6 views
3

Meine Tabelle sieht wie folgt aus:Verwendung mehrerer UNION ALL-Anweisungen in WITH-Klausel

CREATE TABLE gyerek (
    gyereke INT, 
    szulonek INT 
); 

Ich versuche, mehrere UNION ALL Aussagen in meiner WITH Klausel zu verwenden:

WITH testver (x, y) AS (
    SELECT gy1.gyereke, gy2.gyereke 
    FROM gyerek gy1, gyerek gy2 
    WHERE gy1.szulonek = gy2.szulonek 
    AND gy1.gyereke <> gy2.gyereke 
), rokon (x, y) AS (
    SELECT * FROM testver 
    UNION ALL 
    (SELECT r1.x, gy1.gyereke 
    FROM rokon r1, gyerek gy1 
    WHERE r1.y = gy1.szulonek) 
    UNION ALL(SELECT gy1.gyereke, r1.y 
    FROM rokon r1, gyerek gy1 
    WHERE r1.x = gy1.szulonek) 
) 
SELECT * FROM rokon; 

ich folgende Fehlermeldung erhalten :

ORA-32041: UNION ALL operation in recursive WITH clause must have only two branches

Meine Frage ist: Gibt es eine Möglichkeit, mehrere UNION ALL Anweisungen zu verwenden? Wenn es nicht gibt, wie kann ich die Vereinheitlichung der letzten zwei SELECT Aussagen erreichen.

+0

Und was erwarten Sie von dieser Abfrage? Ich glaube, es könnte so viel einfacher geschrieben werden, und wenn es funktioniert, hätte es übrigens doppelte Datensätze zurückgegeben. Ist es das, was du dir gewünscht hast? –

+0

Brauchen Sie wirklich "UNION ALL"? Wählt nicht 'SELECT r1.x, gy1.gyereke FROM rokon r1 beitreten gyerek gy1 ON gy1.szulonek IN (r1.x, r1.y)' ausreichen? –

+0

Eigentlich versuche ich 'Datalog' Regeln in' SQL' umzuschreiben. Ich weiß nicht, ob es einfacher wäre, ich habe vor kurzem angefangen, die Sprache zu lernen, und ich habe mich gefragt, warum ich nicht in der Lage bin, mehrere UNION ALL's zu benutzen. –

Antwort

2

In der Rekursion Sie mit x auf einem y Spiel gehen wollen und mit y auf einem x Spiel. Verwenden Sie CASE WHEN, um zu überprüfen, welches übereinstimmt.

, rokon (x, y) AS (
    SELECT x, y FROM testver 
    UNION ALL 
    SELECT CASE WHEN gy1.szulonek = r1.x THEN r1.y ELSE r1.x END, gy1.gyereke 
    FROM rokon r1 
    JOIN gyerek gy1 ON gy1.szulonek IN (r1.x, r1.y) 
) 
Verwandte Themen