2016-02-11 3 views
7

Folgende Abfrage zeigt, dass select * kombiniert mit connect by und left join nicht alle Spalten, sondern nur Spalten in diesen Bedingungen verwendet. Dieses Verhalten war nützlich für mich, da select * in Release nicht verwendet werden sollte, ist es nützlich, Daten anzufordern.Oracle select asterisk verbinden durch Join sql-92 Kombination

with t1 as (
    select 1 id, 0 parent, 'ROOT' name from dual 
    union all 
    select 2 id, 1 parent, 'CHILD-1' name from dual 
    union all 
    select 3 id, 1 parent, 'CHILD-2' name from dual 
), t2 as (
    select 1 t1id, 'node' special from dual 
) 
    select * from t1 
    left join t2 on t2.t1id=t1.id 
    start with id = 2 
    connect by prior parent = id; 

während andere Anfragen gibt alle Spalten

select * from t1 
    start with id = 2 
    connect by prior parent = id; 

    select * from t1 
    left join t2 on t2.t1id=t1.id; 

I Dokumentation nicht auf dieser Funktionalität finden konnte, gibt es eine?

+0

SELECT t1 JOIN. *, T2. * 'Werke.Keine Ahnung, warum 'SELECT *' nicht funktioniert. – MT0

+0

und das Hinzufügen von 'WHERE Name IS NOT NULL UND (Spezial IS NULL ODER Spezial IS NOT NULL)' bedeutet dann, dass diese Spalten in der 'SELECT *' erscheinen. – MT0

Antwort

0

Ich glaube, die Dokumentation Sie suchen, finden Sie hier: Hierarchical Queries

Der relevanteste Teil:

Oracle verarbeitet hierarchische Abfragen wie folgt:

  • A verbinden, Wenn vorhanden, wird zuerst ausgewertet, ob der Join in der FROM-Klausel oder mit WHERE-Klauselprädikaten angegeben ist.

  • Die CONNECT BY-Bedingung wird ausgewertet.

  • Alle verbleibenden WHERE-Klauselprädikate werden ausgewertet.

    1. Oracle wählt die Wurzelreihe (n) der Hierarchie - jene Zeilen, die das START erfüllen: mit den folgenden Schritten

Oracle dann die Informationen aus diesen Auswertungen verwendet die Hierarchie zu bilden, MIT Bedingung.

  • Oracle wählt die untergeordneten Zeilen jeder Stammzeile aus. Jede untergeordnete Zeile muss die Bedingung der CONNECT BY-Bedingung in Bezug auf eine der Stammzeilen erfüllen.

  • Oracle wählt aufeinanderfolgende Generationen von untergeordneten Zeilen aus. Oracle wählt zuerst die untergeordneten Elemente der Zeilen aus, die in Schritt 2 zurückgegeben wurden, und dann die untergeordneten Elemente dieser untergeordneten Elemente und so weiter. Oracle wählt immer untergeordnete Elemente aus, indem die CONNECT BY-Bedingung in Bezug auf eine aktuelle übergeordnete Zeile ausgewertet wird.

  • Wenn die Abfrage eine WHERE-Klausel ohne Join enthält, löscht Oracle alle Zeilen aus der Hierarchie, die die Bedingung der WHERE-Klausel nicht erfüllen. Oracle wertet diese Bedingung für jede Zeile einzeln aus, anstatt alle untergeordneten Elemente einer Zeile zu entfernen, die die Bedingung nicht erfüllt.

  • Oracle gibt die Zeilen in der in Abbildung 9-1 gezeigten Reihenfolge zurück. Im Diagramm erscheinen Kinder unter ihren Eltern. Eine Erläuterung der hierarchischen Bäume finden Sie in Abbildung 3-1, "Hierarchischer Baum".

  • 0

    Nicht SQL-92, aber SELECT erreichen * + CONNECT BY + LINKS

    WITH t1 AS (
        SELECT 1 ID, 0 PARENT, 'ROOT' NAME FROM dual 
        UNION ALL 
        SELECT 2 ID, 1 PARENT, 'CHILD-1' NAME FROM dual 
        UNION ALL 
        SELECT 3 ID, 1 PARENT, 'CHILD-2' NAME FROM dual 
    ), t2 AS (
        SELECT 1 t1id, 'node' special FROM dual 
    ) 
    SELECT  * 
    FROM  t1, t2 
    WHERE t2.t1id(+) = t1.ID 
    START WITH ID = 2 
    CONNECT BY PRIOR PARENT = ID 
    ;