oracle - CONNECT BY 与递归查询
问题描述
这是我的桌子,
CREATE TABLE "FILES"
(
"DISKELEMENTID" NUMBER NOT NULL ENABLE,
"FILENAME" VARCHAR2(200 BYTE),
"PARENTDISKELEMENTID" NUMBER,
CONSTRAINT "FILES_PK" PRIMARY KEY ("DISKELEMENTID")
)
和数据:
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (1,'C:',null);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (2,'D:',null);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (3,'C:\OperatingSystem',1);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (4,'C:\Temp',1);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (5,'D:\Video',2);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (6,'D:\Music',2);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (7,'C:\OperatingSystem\file01.txt',3);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (8,'C:\OperatingSystem\file02.txt',3);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (9,'D:\Video\video01.avi',5);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (10,'D:\Video\video01.avi',5);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (11,'D:\Video\Temp',5);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (12,'D:\Video\Temp\file-d-temp01.txt',11);
Insert into FILES (DISKELEMENTID,FILENAME,PARENTDISKELEMENTID) values (13,'D:\Video\Temp\file-d-temp02.txt',11);
我想要一个解释/仔细检查我的代码是否相同:使用 CONNECT 实现的相同查询和使用递归查询实现的相同查询。即使返回的数据相同,我也想检查/解释为什么它是相同的。
使用 CONNECT BY 查询:
SELECT Files.DiskElementId,
prior FileName as Parent,
CONNECT_BY_ROOT FileName as TopParent,
Files.FileName FROM Files
START WITH ParentDiskElementID is NULL
connect by prior DiskElementID = ParentDiskElementID
ORDER BY DiskElementId
并使用递归查询进行查询:
with q(DiskElementId, Parent,TopParent,FileName) as
(
SELECT
DiskElementId,
null as Parent,
FileName as TopParent,
FileName
FROM Files WHERE parentdiskelementid is null
UNION ALL
SELECT
Files.DiskElementId,
q.FileName /* prior filename ?? */ as Parent,
q.TopParent /*CONNECT_BY_ROOT FileName as TopParent ??? */ as TopParent,
Files.FileName
FROM Files INNER JOIN q ON files.parentdiskelementid = q.DiskElementId
)
SELECT DiskElementId, Parent,TopParent,FileName FROM q ORDER BY DiskElementId;
两个查询返回相同的数据
解决方案
推荐阅读
- javascript - 在模板文字中,如何根据条件隐藏元素?
- mongodb - Mongoose 动态地将对象从不同集合中的数组添加到模式
- node.js - 快速网关记录每个请求
- next.js - 将 Next.js v10.1.13 更新到 webpack5 时,收到警告 Can't resolve 'fsevents' in chokidar
- angular - 观察者订阅不会将数据加载到数据源,使用材料表 Angular
- bash - Unix命令在嵌套目录下的多个文件中查找和替换字符串
- python - 编解码器无法解码字节 - base64-decoding
- html - 如何在 CSS Grid 中勾勒出整列
- formatting - TexMaker 中的列表格式不一致
- reactjs - 编辑器反应草稿所见即所得无法读取未定义的属性“名称”