如何在connect by sql中获取start by属性

如何在connect by sql中获取start by属性,sql,oracle,recursion,connect-by,Sql,Oracle,Recursion,Connect By,我使用的是递归sql,我有这样一个查询 SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid FROM FOLDER_Table START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID 如何在“选择属性”中显示folderId=12345中给出的folderId? 如果我在下面运行查询 SELECT R

我使用的是递归sql,我有这样一个查询

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid
   FROM FOLDER_Table
   START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID
如何在“选择属性”中显示folderId=12345中给出的folderId? 如果我在下面运行查询

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, folderId
   FROM FOLDER_Table
   START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID
我得到的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;
您可以使用获取层次结构的根,在本例中,由于您遍历层次结构的方式,它是您指定的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或更高版本,您还可以使用而不是
connectby
语法,这样可以避免颠倒:

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

锚定成员获取您的初始目标行,递归成员在传递您希望保留的任何其他信息的同时,预先输入下一个更高级别的文件夹名称。

我有一个场景,我将在开始时使用子查询。那样的话,你会怎么说:开始_folder@dvanwesh这不是最好的解决方案,但可能对您有用一个小数据示例,它仍然反映了实际问题的所有复杂性、需求的逻辑以及示例数据的输出,比发布代码更有用。你让我们从一个不起作用的答案中猜出问题,这没有多大意义,是吗?