use*_*124 1 sql oracle oracle10g
我有两张桌子,tbl_folder:
FOLDER_ID FOLDER_NAME PARENT_FOLDER_ID
1 Folder1
2 Folder1.1 1
3 Folder1.2 1
4 Folder1.1.1 2
5 Folder1.1.2 2
6 Folder1.2.1 3
7 Folder1.2.2 3
Run Code Online (Sandbox Code Playgroud)
而且tbl_file:
FILE_ID FILE_NAME PARENT_FOLDER_ID ACTIVITY_ID
1 Abc.txt 5 2
2 PQR.txt 2 1
3 XYZ.txt 7 2
Run Code Online (Sandbox Code Playgroud)
我activity_id作为输入传递给一个过程,从中我可以得到该parent_folder_id活动ID的所有文件.我想使用来自的数据获取该父文件夹的完整路径tbl_folder.
例如,如果我传递2,activity_id那么我会得到两个文件:
Abc.txt - 文件的父文件夹ID为5XYZ.txt - 文件的父文件夹ID为7从parent_folder_id我将得到文件夹的名称,例如Folder1.1.2.我将选择该文件夹parent_folder_id并获取其名称和父级,依此类推.最后我将为Abc.txtas 生成路径Folder1\Folder1.1\Folder1.1.2.
这样做的正确方法是什么?我应该使用循环吗?还是一张临时桌子?或者是其他东西?
您可以使用分层查询来获取每个文件夹的完整路径:
select folder_id, sys_connect_by_path(folder_name, '/') as path
from tbl_folder
start with parent_folder_id is null
connect by parent_folder_id = prior folder_id;
FOLDER_ID PATH
---------- ----------------------------------------
1 /Folder1
2 /Folder1/Folder1.1
4 /Folder1/Folder1.1/Folder1.1.1
5 /Folder1/Folder1.1/Folder1.1.2
3 /Folder1/Folder1.2
6 /Folder1/Folder1.2/Folder1.2.1
7 /Folder1/Folder1.2/Folder1.2.2
Run Code Online (Sandbox Code Playgroud)
该sys_connect_by_path功能正在为您构建完整路径.
您可以加入tbl_file到您的文件中以获取每个文件的完整路径:
select f.file_name, h.path
from tbl_file f
join (
select folder_id, sys_connect_by_path(folder_name, '/') as path
from tbl_folder
start with parent_folder_id is null
connect by parent_folder_id = prior folder_id
) h
on h.folder_id = f.parent_folder_id
where f.activity_id = 2;
FILE_NAME PATH
---------- ----------------------------------------
Abc.txt /Folder1/Folder1.1/Folder1.1.2
XYZ.txt /Folder1/Folder1.2/Folder1.2.2
Run Code Online (Sandbox Code Playgroud)
或者使用反斜杠并且根文件夹上没有前导斜杠(可以删除)ltrim(),这更接近您在问题中的示例:
select f.file_name, ltrim(h.path, '\') as path
from tbl_file f
join (
select folder_id, sys_connect_by_path(folder_name, '\') as path
from tbl_folder
start with parent_folder_id is null
connect by parent_folder_id = prior folder_id
) h
on h.folder_id = f.parent_folder_id
where f.activity_id = 2;
FILE_NAME PATH
---------- ----------------------------------------
Abc.txt Folder1\Folder1.1\Folder1.1.2
XYZ.txt Folder1\Folder1.2\Folder1.2.2
Run Code Online (Sandbox Code Playgroud)
在Oracle的更高版本中,您还可以使用递归子查询因子,但在10g中不可用.