Abrufen von Zählwerten / Gesamtsummen auf jeder Ebene einer hierarchischen Abfrage mithilfe von CONNECT BY

Ich habe verdammt viel Zeit damit. Ich versuche, eine Abfrage (mit Oracle) für eine Tabelle mit einer rekursiven Beziehung (hierarchisch) zu schreiben und die Gesamtzahl der Datensätze abzurufen, die in einer anderen Tabelle an und unter jedem Knoten im Baum gespeichert sind. Die andere Tabelle enthält nur Datensätze, die den Blattknoten zugeordnet sind. Ich möchte jedoch Summen an und unter jedem Knoten im Baum erhalten. Angenommen, ich habe zwei Tabellen. DIRS enthält die Verzeichnisnamen und eine rekursive Beziehung, die die Struktur der Verzeichnisse angibt, und FILES enthält Dateiinformationen mit einem Fremdschlüssel für DIRS, der das Verzeichnis angibt, in dem sich die Datei befindet:

DIRS
====
DIR_ID 
PARENT_DIR_ID
DIR_NAME

FILES
=====
FILE_ID
FILE_NAME
DIR_ID
FILE_SIZE

Wenn DIRS enthält:

DIR_ID   PARENT_DIR_ID   DIR_NAME
======   =============   ========
1                        ROOT
2        1               DIR1_1
3        1               DIR1_2
4        2               DIR2_1
5        2               DIR2_2

und DATEIEN enthält

FILE_ID   FILE_NAME   DIR_ID   FILE_SIZE
=======   =========   ======   =========
1         test1.txt   5        100
2         test2.txt   5        200
3         test5.txt   5         50 
4         test3.txt   3        300
5         test4.txt   3        300
6         test6.txt   4        100

Ich möchte eine Abfrage, die den Pfad zusammen mit der Anzahl der Dateien in oder unter jedem Knoten in der Hierarchie zurückgibt. Grundsätzlich ein Rollup der Anzahl der Dateien. Das Abfrageergebnis würde also ungefähr so ​​aussehen:

Path                    File_Count
=====                   ===========
/ROOT                   6
/ROOT/DIR1_1            4
/ROOT/DIR1_1/DIR2_1     1
/ROOT/DIR1_1/DIR2_2     3
/ROOT/DIR1_2            2

AKTUALISIEREN SQL-Skript zum Erstellen der Tabellen mit Beispieldaten, die den obigen Angaben entsprechen:

create table DIRS (dir_id number(38) primary key
    , parent_dir_id number(38) null references DIRS(dir_id)
    , dir_name varchar2(128) not null);

create table FILES (file_id number(38) primary key
    , file_name varchar2(128) not null
    , dir_id number(38) not null references DIRS(dir_id)
    , file_size number not null
    , unique (dir_id, file_name));

insert into DIRS 
select 1, null, 'ROOT' from dual
union all select 2, 1, 'DIR1_1' from dual 
union all select 3, 1, 'DIR1_2' from dual 
union all select 4, 2, 'DIR2_1' from dual 
union all select 5, 2, 'DIR2_2' from dual;

insert into files
select 1, 'test1.txt', 5, 100 from dual
union all select 2, 'test2.txt', 5, 200 from dual
union all select 3, 'test5.txt', 5, 50 from dual
union all select 4, 'test3.txt', 3, 300 from dual
union all select 5, 'test4.txt', 3, 300 from dual
union all select 6, 'test6.txt', 4, 100 from dual;

commit;

Antworten auf die Frage(2)

Ihre Antwort auf die Frage