gpt4 book ai didi

sql - 使用 CONNECT BY 在分层查询的每个级别获取计数/总数

转载 作者:行者123 更新时间:2023-12-04 15:13:56 28 4
gpt4 key购买 nike

我在这方面玩得很开心。我正在尝试针对具有递归关系(分层)的表编写查询(使用 Oracle),并获取存储在树中每个节点及其下方的另一个表中的记录总数。另一个表只有与叶节点相关的记录。但是,我想获得树中每个节点处和下方的总数。例如,假设我有两张 table 。 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

更新 使用示例数据创建表以匹配上述内容的 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;

最佳答案

这个非常简单:

09:38:54 HR@vm_xe> l                                      
1 select sys_connect_by_path(dp.dir_name, '/') path
2 ,(select count(file_id)
3 from dirs dc
4 ,files f
5 where f.dir_id(+) = dc.dir_id
6 connect by prior dc.dir_id = dc.parent_dir_id
7 start with dc.dir_id = dp.dir_id
8 ) count
9 from dirs dp
10 connect by prior dp.dir_id = dp.parent_dir_id
11* start with dp.parent_dir_id is null
09:38:55 HR@vm_xe> /

PATH COUNT
------------------------------ ----------
/ROOT 6
/ROOT/DIR1_1 4
/ROOT/DIR1_1/DIR2_1 1
/ROOT/DIR1_1/DIR2_2 3
/ROOT/DIR1_2 2

5 rows selected.

Elapsed: 00:00:00.02

关于sql - 使用 CONNECT BY 在分层查询的每个级别获取计数/总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12360160/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com