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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top