Sql 循环直到父值为空

Sql 循环直到父值为空,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有两张桌子,tbl\u文件夹: 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 Folde

我有两张桌子,
tbl\u文件夹

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_ID   FILE_NAME   PARENT_FOLDER_ID    ACTIVITY_ID
1         Abc.txt            5                2
2         PQR.txt            2                1
3         XYZ.txt            7                2
我正在将
activity\u id
作为输入传递给一个过程,从中我可以获得该activity id的所有文件的
parent\u folder\u id
。我想使用
tbl\u folder
中的数据获取父文件夹的完整路径

例如,如果我将2作为
activity\u id
传递,那么我将获得两个文件:

  • Abc.txt
    -文件的父文件夹ID为5
  • XYZ.txt
    -文件的父文件夹ID为7
  • parent\u folder\u id
    中,我将获得文件夹的名称,例如
    Folder1.1.2
    。 我将选择该文件夹的
    parent\u folder\u id
    ,并获取其名称和父文件夹,依此类推。最后,我将为
    Abc.txt
    生成路径,作为
    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       
    
    在这里,我们正在为您构建完整的路径

    您可以将
    tbl_文件
    加入到该文件中,以获得每个文件的完整路径:

    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中不可用。

    您可以使用获取每个文件夹的完整路径:

    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       
    
    在这里,我们正在为您构建完整的路径

    您可以将
    tbl_文件
    加入到该文件中,以获得每个文件的完整路径:

    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中不可用