如何在 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
锚点成员获取您的初始目标行,递归成员将下一个更高级别的文件夹名称添加到前面,同时传递您想要保留的任何其他信息。
我正在使用递归 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
锚点成员获取您的初始目标行,递归成员将下一个更高级别的文件夹名称添加到前面,同时传递您想要保留的任何其他信息。