Sql 从表示树结构的Oracle表中选择所有子代行
我在Oracle10g中有一个表MYTYPE,表示一个树结构,如下所示:Sql 从表示树结构的Oracle表中选择所有子代行,sql,oracle,oracle10g,hierarchical-data,recursive-query,Sql,Oracle,Oracle10g,Hierarchical Data,Recursive Query,我在Oracle10g中有一个表MYTYPE,表示一个树结构,如下所示: ID | PARENTID | DETAIL Select * from MYDETAIL Starting with PARENTID= 1 --or whatever the root ID is connect by PARENTID = prior ID 我想选择MYTYPE中属于特定ID后代的所有行,以便我可以在其他地方创建查询,例如: SELECT * FROM MYDETAIL WHERE MY
ID | PARENTID | DETAIL
Select *
from MYDETAIL
Starting with PARENTID= 1 --or whatever the root ID is
connect by PARENTID = prior ID
我想选择MYTYPE中属于特定ID后代的所有行,以便我可以在其他地方创建查询,例如:
SELECT *
FROM MYDETAIL
WHERE MYTYPEID IN [all MYTYPE which are descendants of some ID];
构建子代集的一种经济高效的方法是什么,最好不使用PL/SQL?直到11g R2,Oracle才支持使用递归子查询分解(SQL Server语法中的CTE)的ANSI分层语法,因此您必须使用Oracle的本机CONNECT BY语法(从v2开始支持): 将问号替换为要查找层次结构数据所基于的父级 参考:
从…开始。。。通过以下方式连接:
ID | PARENTID | DETAIL
Select *
from MYDETAIL
Starting with PARENTID= 1 --or whatever the root ID is
connect by PARENTID = prior ID
使用RDBMS中的ID、ParentID
列管理分层数据称为模型。虽然很容易实现和维护(即插入、更新、删除),但确定血统(即祖先和后代)的成本很高。正如其他答案所写,Oracle的connectby
将起作用,但这是一项昂贵的操作。您最好以不同的方式表示数据
对于您的情况,最简单的解决方案可能是向模式中添加一个所谓的表,并向原始表中添加一个LEVEL
列。该表有列ID,genderanti
,其中按ID选择将给出所有后代记录,按DescentantID选择将给出所有祖先记录<代码>级别
在基表上是订购记录所必需的。通过这种方式,您可以在昂贵的更新和便宜的阅读之间进行权衡,这正是您的问题所暗示的
涉及更改基础数据的其他可能性包括嵌套集和物化路径表示。这提供了类似的折衷方案,即用更昂贵的写入操作换取更便宜的读取操作。有关选项、优点和缺点的完整列表,以及一些实施说明 以下是oracle中“连接方式”功能的详细信息。
问问题、不选择正确答案或不提供您仍然需要的帮助的更多细节的糟糕形式。