循环直到父值为空
Loop in until parent value is null
我有两个table,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
和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
我正在将 activity_id
作为过程的输入传递,从中我可以获得具有该 activity ID 的所有文件的 parent_folder_id
。我想使用 tbl_folder
.
中的数据获取该父文件夹的完整路径
例如,如果我将 2 作为 activity_id
传递,那么我将得到两个文件:
Abc.txt
- 文件的父文件夹 ID 为 5
XYZ.txt
- 文件的父文件夹 ID 为 7
从 parent_folder_id
我会得到文件夹的名称,例如Folder1.1.2
。
我将选择该文件夹的 parent_folder_id
并获取其名称和父级,等等。最后,我将为 Abc.txt
生成路径 Folder1\Folder1.1\Folder1.1.2
.
正确的做法是什么?我应该使用循环吗?还是临时的table?或者别的什么?
您可以使用 hierarchical query 获取每个文件夹的完整路径:
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
这里sys_connect_by_path
function正在为您搭建全路径
您可以将 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
或者在根文件夹上使用反斜杠并且没有前导斜杠,可以使用 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
在更高版本的 Oracle 中,您还可以使用递归子查询分解,但这在 10g 中不可用。
我有两个table,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
和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
我正在将 activity_id
作为过程的输入传递,从中我可以获得具有该 activity ID 的所有文件的 parent_folder_id
。我想使用 tbl_folder
.
例如,如果我将 2 作为 activity_id
传递,那么我将得到两个文件:
Abc.txt
- 文件的父文件夹 ID 为 5XYZ.txt
- 文件的父文件夹 ID 为 7
从 parent_folder_id
我会得到文件夹的名称,例如Folder1.1.2
。
我将选择该文件夹的 parent_folder_id
并获取其名称和父级,等等。最后,我将为 Abc.txt
生成路径 Folder1\Folder1.1\Folder1.1.2
.
正确的做法是什么?我应该使用循环吗?还是临时的table?或者别的什么?
您可以使用 hierarchical query 获取每个文件夹的完整路径:
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
这里sys_connect_by_path
function正在为您搭建全路径
您可以将 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
或者在根文件夹上使用反斜杠并且没有前导斜杠,可以使用 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
在更高版本的 Oracle 中,您还可以使用递归子查询分解,但这在 10g 中不可用。