2017-01-02 2 views
1

Ich möchte eine Ansicht erstellen, die mir die Enkel der ältesten Person gibt, die einige hat. Und das Problem ist, dass ich keinen Weg finden kann, in SQL die Phrase zu übersetzen: "Wer hat welche".Oracle SQL: Stammbaumansichten mit Bäumen

ich nur in einer Tabelle arbeiten, der ist ziemlich einfach:

Person: Nummer (Typennummer), Nachname, Vorname, dateOfBirth, Geschlecht, Mutter (Typnummer), Vater (Typnummer).

Dies ist, was ich zu tun versucht:

Ich habe versucht, eine Ansicht zu erstellen, die mir die älteste Person, die Enkelkinder hat gibt (aber das ist nicht das, was hier geschehen ist)

CREATE OR REPLACE 
    VIEW oldestone 
    AS SELECT number FROM persons 
    WHERE (sysdate-dateofbirth)/365 >= ALL 
    (SELECT (sysdate-dateofbirth)/365 FROM persons) 
    AND EXISTS (SELECT * FROM persons 
        WHERE level=3 
      START WITH number = number 
      CONNECT BY PRIOR number = father OR PRIOR numero = mother); 

Und mit die Anzahl der ersten Blick kann ich die Enkel bekommen:

CREATE OR REPLACE 
VIEW grandchildren 
AS SELECT firstname,lastname FROM persons 
    WHERE level=3 
    START WITH number = (SELECT number FROM oldestone) 
    CONNECT BY PRIOR number = father OR PRIOR number = mother; 

das Problem ist, ich weiß, ich bin nicht zu übersetzen: die Enkel der ältesten Person wer hat einige. Weil ich in meiner ersten Ansicht, wenn ich Nummer = Nummer geschrieben habe, möchte ich auf die Nummer meiner Select-Klausel Zeile 3 verweisen, aber ich weiß, dass es nicht der Fall ist.

Vielen Dank im Voraus für Sie Hilfe Jungs!

Chris.

Antwort

0

Wenn Sie die Richtung ändern, um "oben" den Stammbaum zu lesen, anstatt "unten", können Sie von den Enkeln zu ihren Eltern und dann zu den Großeltern gehen. Während du dich in der innersten Unterabfrage befindest, kannst du dich mit dem Operator an die Namen der Enkelkinder erinnern und sie mit den Geburtsdaten ihrer Vorfahren auf verschiedenen Ebenen in Verbindung bringen (ihre eigenen Dobs auf Level 1, die Dobs ihrer Eltern) Level 2, die Dobs ihrer Großeltern auf Level 3).

In der Zwischen-Unterabfrage selektiere ich Zeilen, die von der hierarchischen Abfrage auf Stufe 3 erzeugt wurden - das zeigt die Geburtsdaten der Großeltern. Ich verwende eine analytische Funktion, um das Mindestgeburtsdatum in derselben Abfrage aufzuzeichnen. (Sie brauchen nicht "Alter" - "älteste" bedeutet frühestes Geburtsdatum!)

Ich schrieb die Abfrage so wirtschaftlich wie möglich, in jeder Phase nur die Spalten zu halten, um das gewünschte Ergebnis zu produzieren (die Namen von die Enkel der ältesten Großeltern); Wenn Sie die Sub-Unterabfrage und die Zwischen-Unterabfrage auswählen und separat ausführen, können Sie, um zu verstehen, wie dies funktioniert, weitere Spalten hinzufügen, um zu sehen, was gerade passiert.

Ich erstellte einige sehr einfache Testdaten in einer WITH-Klausel (nicht Teil der Lösung); Vielleicht möchten Sie mit mehr interessanten Eingaben testen. Viel Glück!

with 
    person (id, last_name, first_name, dob, mother, father) as (
     select 1, 'Doe', 'John', date '1990-03-02', 2, 3 from dual union all 
     select 2, 'Doe', 'Anne', date '1962-11-21', 4, 5 from dual union all 
     select 3, 'Doe', 'Alan', date '1960-02-23', 6, 7 from dual union all 
     select 4, 'Orf', 'Jean', date '1953-10-11', 8, 9 from dual union all 
     select 5, 'Orf', 'Stan', date '1952-09-06', 10, 11 from dual union all 
     select 22, 'Sun', 'Ryan', date '1968-02-21', 23, 24 from dual union all 
     select 23, 'Sun', 'Mary', date '1934-12-09', 26, 27 from dual 
    ) 
-- end of test data; solution (SQL query) begins below this line 
select last_name, first_name 
from (
     select last_name, first_name, dob, min(dob) over() as min_dob 
     from (
        select connect_by_root(last_name) as last_name , 
         connect_by_root(first_name) as first_name, dob, level as lvl 
        from person 
        connect by id in (prior mother, prior father) 
     ) 
     where lvl = 3 
) 
where dob = min_dob 
; 

LAST_NAME FIRST_NAME 
--------- ---------- 
Doe  John