需要SQL查询帮助才能从具有父子表的同一表中获取数据
我的oracle数据库中有一个表,如下所示:需要SQL查询帮助才能从具有父子表的同一表中获取数据,sql,oracle,Sql,Oracle,我的oracle数据库中有一个表,如下所示: FolderID Name ParentFolderID 1200 A 1000 1201 B 1000 1202 C 1000 1203 D 1000 1204 E 1200 1205 F 1200 1206 G 1201 1207 H
FolderID Name ParentFolderID
1200 A 1000
1201 B 1000
1202 C 1000
1203 D 1000
1204 E 1200
1205 F 1200
1206 G 1201
1207 H 1205
1208 I 1205
1209 J 1205
在此表中,文件夹id 1000包含childs 1200、1201、1202、1203。文件夹id 1200有子文件夹1204、1205。1201有孩子1206。1205有孩子1207、1208和1209。我要找的是获取传递给查询的文件夹id的所有子文件夹id。如果我超过1000,它将返回所有子行和子行
谢谢尝试类似的查询
SELECT
folderid,
name
FROM the_unknown_table
START WITH folderid = :first_folder_id
CONNECT BY PRIOR folderid = parentfolderId;
如果您想在一列中使用逗号分隔所有内容,请使用SYS\u CONNECT\u BY\u PATH
尝试查询式
SELECT
folderid,
name
FROM the_unknown_table
START WITH folderid = :first_folder_id
CONNECT BY PRIOR folderid = parentfolderId;
如果您想在一列中使用逗号分隔所有内容,请使用SYS\u CONNECT\u BY\u PATH
与connect by/Previor等效的标准SQL方式使用递归CTE:
DROP SCHEMA opa CASCADE;
CREATE SCHEMA opa;
SET search_path='opa';
CREATE TABLE parents
( id INTEGER NOT NULL PRIMARY KEY
, zname text
, parent_id INTEGER REFERENCES parents (id)
);
INSERT INTO parents(id,zname,parent_id) VALUES
(1000 , '@', NULL)
,(1200 , 'A', 1000)
,(1201 , 'B', 1000)
,(1202 , 'C', 1000)
,(1203 , 'D', 1000)
,(1204 , 'E', 1200)
,(1205 , 'F', 1200)
,(1206 , 'G', 1201)
,(1207 , 'H', 1205)
,(1208 , 'I', 1205)
,(1209 , 'J', 1205)
;
WITH RECURSIVE zopa AS (
SELECT p0.id AS opa_id, p0.id AS id
, p0.zname AS zname, p0.parent_id AS parent_id
FROM parents p0
WHERE NOT EXISTS (
SELECT * FROM parents nx WHERE nx.id = p0.parent_id)
UNION
SELECT
zp.opa_id AS opa_id
, p1.id AS id
, p1.zname AS zname
, p1.parent_id AS parent_id
FROM parents p1
JOIN zopa zp ON zp.id = p1.parent_id
)
select *
FROM zopa ct
WHERE ct.opa_id = 1000
;
结果:
NOTICE: drop cascades to table opa.parents
DROP SCHEMA
CREATE SCHEMA
SET
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "parents_pkey" for table "parents"
CREATE TABLE
INSERT 0 11
opa_id | id | zname | parent_id
--------+------+-------+-----------
1000 | 1000 | @ |
1000 | 1202 | C | 1000
1000 | 1200 | A | 1000
1000 | 1201 | B | 1000
1000 | 1203 | D | 1000
1000 | 1205 | F | 1200
1000 | 1204 | E | 1200
1000 | 1206 | G | 1201
1000 | 1209 | J | 1205
1000 | 1207 | H | 1205
1000 | 1208 | I | 1205
(11 rows)
与connect by/Previor等效的标准SQL方式使用递归CTE:
DROP SCHEMA opa CASCADE;
CREATE SCHEMA opa;
SET search_path='opa';
CREATE TABLE parents
( id INTEGER NOT NULL PRIMARY KEY
, zname text
, parent_id INTEGER REFERENCES parents (id)
);
INSERT INTO parents(id,zname,parent_id) VALUES
(1000 , '@', NULL)
,(1200 , 'A', 1000)
,(1201 , 'B', 1000)
,(1202 , 'C', 1000)
,(1203 , 'D', 1000)
,(1204 , 'E', 1200)
,(1205 , 'F', 1200)
,(1206 , 'G', 1201)
,(1207 , 'H', 1205)
,(1208 , 'I', 1205)
,(1209 , 'J', 1205)
;
WITH RECURSIVE zopa AS (
SELECT p0.id AS opa_id, p0.id AS id
, p0.zname AS zname, p0.parent_id AS parent_id
FROM parents p0
WHERE NOT EXISTS (
SELECT * FROM parents nx WHERE nx.id = p0.parent_id)
UNION
SELECT
zp.opa_id AS opa_id
, p1.id AS id
, p1.zname AS zname
, p1.parent_id AS parent_id
FROM parents p1
JOIN zopa zp ON zp.id = p1.parent_id
)
select *
FROM zopa ct
WHERE ct.opa_id = 1000
;
结果:
NOTICE: drop cascades to table opa.parents
DROP SCHEMA
CREATE SCHEMA
SET
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "parents_pkey" for table "parents"
CREATE TABLE
INSERT 0 11
opa_id | id | zname | parent_id
--------+------+-------+-----------
1000 | 1000 | @ |
1000 | 1202 | C | 1000
1000 | 1200 | A | 1000
1000 | 1201 | B | 1000
1000 | 1203 | D | 1000
1000 | 1205 | F | 1200
1000 | 1204 | E | 1200
1000 | 1206 | G | 1201
1000 | 1209 | J | 1205
1000 | 1207 | H | 1205
1000 | 1208 | I | 1205
(11 rows)
独生子女和亚子女?或者所有可能的子子系统?我已经在我的表中看到了4级。所以,我至少需要达到4级。@Javeed-或者这种情况会改变吗,你将来有5级或以上的深度,那么你需要达到它的深度吗?Javeed,请接受一个对你来说正确的答案。独生子女和亚子女?或者所有可能的子子系统?我已经在我的表中看到了4级。所以,我至少需要达到4级。@Javeed-或者这种情况会改变吗,你将来会有5级或以上的深度,那么你需要达到它的深度吗?Javeed,请接受一个对你来说正确的答案。这需要Oracle 11.2。以前的版本只支持使用CONNECT BY的递归查询。问题被标记为sql和oracle,没有版本,我想添加一个通用解决方案。@wildpasser:我知道。我只是想指出,只有最新版本的Oracle支持这种语法。虽然不完全符合标准的要求,正如您所示,因为它不允许递归关键字,即使它在标准中是强制性的,至少到目前为止,Larry已经获得了足够的绳子来系船。这需要Oracle 11.2。以前的版本只支持使用CONNECT BY的递归查询。问题被标记为sql和oracle,没有版本,我想添加一个通用解决方案。@wildpasser:我知道。我只是想指出,只有最新版本的Oracle支持这种语法。虽然不完全符合标准的要求,正如您所展示的,因为它不允许递归关键字,即使它在标准中是强制性的,至少到目前为止,Larry已经获得了足够的绳子来系船。