hierarchische Abfrage
-
22-07-2019 - |
Frage
Ich hoffe, ich bin in der Lage, das Problem zu erklären, das mich puzzeling. Ich habe die folgende hierarchische Datensatz (dies ist nur Teilmenge von 34K Datensätze)
PARENT_ID CHILD_ID EXAM
TUDA12802 TUDA12982 N
TUDA12982 TUDA12984 J
TUDA12984 TUDA999 J
TUDA12982 TUDA12983 N
TUDA12983 TUDA15322 J
TUDA12983 TUDA15323 J
Dies ist eine Darstellung des Baumes
TUDA12982 N
- TUDA12984 J
-- TUDA999 J
- TUDA12983 N
-- TUDA15322 J
-- TUDA15323 J
Was ich brauche, ist eine Liste aller Datensätze mit Prüfung = N und die zugrunde liegenden Prüfung = ‚J‘ Aufzeichnungen, die verschachtelt werden können.
select *
from test1
connect by prior child_id = parent_id
start with child_id = 'TUDA12982'
order siblings by child_id;
Gibt mir
PARENT_ID CHILD_ID EXAM
TUDA12802 TUDA12982 N
TUDA12982 TUDA12984 J
TUDA12984 TUDA999 J
TUDA12982 TUDA12983 N
TUDA12983 TUDA15323 J
TUDA12983 TUDA15322 J
Aber was ich brauche, ist
TUDA12802 TUDA12982 N
TUDA12982 TUDA12984 J
TUDA12984 TUDA999 J
Der Verfahrweg muss aufhören, wenn ich ein EXAM begegnen = 'N' Rekord.
Ich brauche so etwas wie ein 'Stop mit' -Klausel.
select *
from test1
connect by prior child_id = parent_id
start with child_id = 'TUDA12982'
stop with exam = 'N'
order siblings by child_id;
Wie kann dies geschehen?
Lösung
Robert,
Sie können dies tun, indem Sie "Prüfung = 'J'" an den connect by-Klausel:
SQL> create table test1(parent_id,child_id,exam)
2 as
3 select 'TUDA12802', 'TUDA12982', 'N' from dual union all
4 select 'TUDA12982', 'TUDA12984', 'J' from dual union all
5 select 'TUDA12984', 'TUDA999', 'J' from dual union all
6 select 'TUDA12982', 'TUDA12983', 'N' from dual union all
7 select 'TUDA12983', 'TUDA15322', 'J' from dual union all
8 select 'TUDA12983', 'TUDA15323', 'J' from dual
9 /
Tabel is aangemaakt.
SQL> select parent_id
2 , child_id
3 , exam
4 , level
5 , lpad(' ',2*level) || sys_connect_by_path(parent_id||'-'||child_id,'/') scbp
6 from test1
7 start with exam = 'N'
8 connect by prior child_id = parent_id
9 and exam = 'J'
10 /
PARENT_ID CHILD_ID E LEVEL SCBP
--------- --------- - ------ ----------------------------------------------------------------------
TUDA12802 TUDA12982 N 1 /TUDA12802-TUDA12982
TUDA12982 TUDA12984 J 2 /TUDA12802-TUDA12982/TUDA12982-TUDA12984
TUDA12984 TUDA999 J 3 /TUDA12802-TUDA12982/TUDA12982-TUDA12984/TUDA12984-TUDA999
TUDA12982 TUDA12983 N 1 /TUDA12982-TUDA12983
TUDA12983 TUDA15322 J 2 /TUDA12982-TUDA12983/TUDA12983-TUDA15322
TUDA12983 TUDA15323 J 2 /TUDA12982-TUDA12983/TUDA12983-TUDA15323
6 rijen zijn geselecteerd.
Viele Grüße, Rob.
Andere Tipps
Klingt wie eine einfache Abfrage, die das gewünschte Produkt erhält und es ist ‚J‘ Kinder sind das, was Sie wollen, so wäre diese Arbeit nicht:
select *
from test1
where child_id = 'TUDA12982'
or exam = 'J'
connect by prior child_id = parent_id
start with child_id = 'TUDA12982'
order siblings by child_id;
Ich habe nicht Oracle, so kann ich nicht testen, ob das funktioniert, aber von dem, was ich von der Syntax verstehen und was ich nur googeln sieht aus wie es funktionieren würde.