如何在 sql 连接中按属性获取开始

how to fetch start by attribute in a connect by sql

我正在使用递归 sql 并且我有这样的查询

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid
   FROM FOLDER_Table
   START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID

如何在 select 属性中显示我在 FOLDERID=12345 中提供的文件夹 ID? 如果我 运行 下面查询

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, folderId
   FROM FOLDER_Table
   START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID

我正在获取对应于 root 的 folderId,但不是 12345

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, :start_folder
   FROM FOLDER_Table
   START WITH FOLDERID=:start_folder CONNECT by PRIOR PARENTFOLDERID=FOLDERID

或者只是

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, 12345 as folderId
   FROM FOLDER_Table
   START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID

这是你需要的吗?

子查询所以我会去:

with subquery as (/*YOUR SUBQUERY*/)
select * from (
SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, 12345 as folderId
       FROM FOLDER_Table
       START WITH FOLDERID=(select 1 from subquery) CONNECT by PRIOR PARENTFOLDERID=FOLDERID), subquery;

您可以使用 CONNECT_BY_ROOT 获取层次结构的根,在本例中,由于您遍历它的方式,它是您指定的 ID:

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,
  parentfolderid, CONNECT_BY_ROOT(folderId) as queried_folderid
FROM FOLDER_Table
START WITH FOLDERID=12345
CONNECT by PRIOR PARENTFOLDERID=FOLDERID;

使用一些虚拟数据的快速演示:

create table folder_table (folderid, parentfolderid, name) as
  select 12345, 1234, 'FolderE' from dual
  union all select 1234, 123, 'FolderD' from dual
  union all select 123, 12, 'FolderC' from dual
  union all select 12, 1, 'FolderB' from dual
  union all select 1, null, 'FolderA' from dual
  union all select 12346, null, 'FolderF' from dual
;

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,
  parentfolderid, CONNECT_BY_ROOT(folderId) as queried_folderid
FROM FOLDER_Table
START WITH FOLDERID=12345
CONNECT by PRIOR PARENTFOLDERID=FOLDERID;

PATH                                               PARENTFOLDERID UERIED_FOLDERID
-------------------------------------------------- -------------- ---------------
FolderE\                                                     1234           12345
FolderD\FolderE\                                              123           12345
FolderC\FolderD\FolderE\                                       12           12345
FolderB\FolderC\FolderD\FolderE\                                1           12345
FolderA\FolderB\FolderC\FolderD\FolderE\                                    12345

如果您使用的是 11gR2 或更高版本,您还可以使用 recursive subquery factoring 而不是 connect by 语法,这样可以避免反转:

WITH r (path, parentfolderid, queriedfolderid) AS (
  SELECT name ||'\', parentfolderid, folderid
  FROM folder_table
  WHERE folderid = 12345
  UNION ALL
  SELECT ft.name ||'\'|| r.path, ft.parentfolderid, r.queriedfolderid
  FROM r
  JOIN folder_table ft ON ft.folderid = r.parentfolderid
)
SELECT *
FROM r;

PATH                                               PARENTFOLDERID QUERIEDFOLDERID
-------------------------------------------------- -------------- ---------------
FolderE\                                                     1234           12345
FolderD\FolderE\                                              123           12345
FolderC\FolderD\FolderE\                                       12           12345
FolderB\FolderC\FolderD\FolderE\                                1           12345
FolderA\FolderB\FolderC\FolderD\FolderE\                                    12345

锚点成员获取您的初始目标行,递归成员将下一个更高级别的文件夹名称添加到前面,同时传递您想要保留的任何其他信息。