私はこれでかなりの時間を過ごしています。再帰関係 (階層) を持つテーブルに対して (Oracle を使用して) クエリを作成し、ツリー内の各ノードの下にある別のテーブルに格納されているレコードの総数を取得しようとしています。もう一方のテーブルには、リーフ ノードに関連付けられたレコードのみが含まれます。ただし、ツリーの各ノードとその下の合計を取得したいと考えています。たとえば、2 つのテーブルがあるとします。DIRS には、ディレクトリ名とディレクトリの構造を識別する再帰的な関係が含まれ、FILES には、ファイルが存在するディレクトリを示す DIRS への外部キーを含むファイル情報が含まれます。
DIRS
====
DIR_ID
PARENT_DIR_ID
DIR_NAME
FILES
=====
FILE_ID
FILE_NAME
DIR_ID
FILE_SIZE
DIRS に以下が含まれている場合:
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
と FILES が含まれています
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
階層内の各ノード内またはその下にあるファイルの数と共にパスを返すクエリが必要です。基本的にファイル数のロールアップです。したがって、クエリの結果は次のようになります。
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 SQL スクリプト:
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;