Con questo ho una gran voglia. Sto cercando di scrivere una query (usando Oracle), su una tabella con una relazione ricorsiva (gerarchica) e ottenere il numero totale di record memorizzati in un'altra tabella a e sotto ciascun nodo nella struttura. L'altra tabella ha solo record associati ai nodi foglia. Tuttavia, voglio ottenere i totali a e sotto ogni nodo nell'albero. Ad esempio, supponiamo di avere due tabelle. DIRS contiene i nomi di directory e una relazione ricorsiva che identifica la struttura delle directory e file contiene informazioni sui file con una chiave esterna per DIRS indicare la directory del file risiede in:Ottenimento di conteggi/totali per ogni livello di una query gerarchica tramite CONNECT BY
DIRS
====
DIR_ID
PARENT_DIR_ID
DIR_NAME
FILES
=====
FILE_ID
FILE_NAME
DIR_ID
FILE_SIZE
Se DIRS contiene:
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
e file contiene
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
voglio una query che restituisce il percorso insieme al numero di file in o al di sotto di ogni nodo del hier archia. Fondamentalmente un rollup del numero di file. Così il risultato della query sarebbe simile:
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
UPDATE sceneggiatura SQL per creare le tabelle con i dati di esempio per corrispondere quanto sopra:
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;
Quale versione di Oracle? 11g R2 aggiunge il factoring sub-query ricorsivo che potrebbe offrire una soluzione più chiara di 'connect by'. –
Sì 11g R2. Esaminerà "sub-query factoring". Non mi è familiare. – GregH
Sembra che sia stato aggiunto il factoring di sub-query in Oracle 9.2 – GregH