2011-01-03 9 views
1

Ich habe eine hierarchische Abfrage, die keine erwartete Zeile (Mitarbeiterausweis = 444) zurückgibt.Hierarchische Abfrage, um die letzte Zeile zurückzugeben

TABLE: hr_data

badge fname supervisor_badge 
111 Jeff 222 
222 Joe 333 
333 John 444 
444 Tom 444 

SQL:

SELECT CONNECT_BY_ISCYCLE As IC, 
     badge, 
     fname, 
     supervisor_badge 
    FROM hr_data 
START WITH badge = '111' 
CONNECT BY NOCYCLE badge = PRIOR supervisor_badge 

Was zurückgegeben:

IC badge fname supervisor_badge 
0 111 Jeff 222 
0 222 Joe 333 
1 333 John 444 

, was erwartet wird:

IC badge fname supervisor_badge 
0 111 Jeff 222 
0 222 Joe 333 
**0** 333 John 444 
**1** 444 Tom 444 

Wie kann ich diese Abfrage erhalten, um den Mitarbeiter Tom zurückzugeben und dann zu stoppen?

Antwort

0

Remove NOCYCLE Klausel aus der Abfrage:

SELECT CONNECT_BY_ISCYCLE As IC, 
     badge, 
     fname, 
     supervisor_badge 
    FROM hr_data 
START WITH badge = '111' 
CONNECT BY badge = PRIOR supervisor_badge 
+0

Dank aber das gibt java.sql.SQLException: ORA-01436: CONNECT BY-Schleife in Benutzerdaten – jeff

+1

Ich bin nicht vertraut mit dieser Funktion, aber kannst du sowas machen? 'CONNECT BY PRIOR Badge! = PRIOR supervisor_badge UND Badge = PRIOR supervisor_badge'. Gemäß dieser Seite (http://www.rampant-books.com/10g_79.htm) können Sie CONNECT_BY_ISCYCLE auch nicht ohne die NOCYCLE-Klausel verwenden, aber in diesem Fall können Sie die Verwendung von CONNECT_BY_ISCYCLE durch eine Überprüfung ersetzen '(badge = supervisor_badge)' –

+0

Danke DWA. Das funktioniert! Leider ist deine richtige Antwort nur ein Kommentar. – jeff

0

den umgekehrten Weg nehmen und den Baum absteigend gibt Ihnen das gewünschte Ergebnis hat, aber nicht Ihren Ansatz gerade noch arbeiten. Hier ist das Gegenteil:

SELECT CONNECT_BY_ISCYCLE As IC, 
     badge, 
     fname, 
     supervisor_badge 
    FROM (select '111' badge, 'Jeff' fname, '222' supervisor_badge from dual union all 
     select '222' badge, 'Joe' fname, '333' supervisor_badge from dual union all 
     select '333' badge, 'John' fname, '444' supervisor_badge from dual union all 
     select '444' badge, 'Tom' fname, '444' supervisor_badge from dual 
     ) 
START WITH badge = '444' 
CONNECT BY NOCYCLE PRIOR badge = supervisor_badge; 

Produziert:

IC BADGE FNAME  SUPERVISOR_BADGE 
--- ----- ---------- ------------------ 
    1 444 Tom  444 
    0 333 John  444 
    0 222 Joe  333 
    0 111 Jeff  222 
+0

Meine Daten waren konzeptionell und es gibt wirklich etwa 10.000 Mitarbeiter in der Datenbank. Ich verstehe nicht, warum ich Unterabfragen in der FROM-Klausel verwenden möchte oder mit anderen Worten, ich verstehe nicht, was Sie in Ihrer Antwort zu vermitteln versuchen. – jeff

+0

@jeff: Die Unterabfrage ist mit der Union alle ist nur so, ich habe einige Beispieldaten, um die Abfrage gegen auszuführen. Für Sie wäre es nur Ihre Quellentabelle. –

Verwandte Themen