StartWith及ConnectBy.docVIP

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
StartWith及ConnectBy

Oracle用Start with...Connect By子句递归查询(1) Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。 创建示例表: CREATE TABLE TBL_TEST ( ? ID??? NUMBER, ? NAME? VARCHAR2(100 BYTE), ? PID?? NUMBER????????????????????????????????? DEFAULT 0 ); ? 插入测试数据: INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(1,10,0); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(2,11,1); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(3,20,0); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(4,12,1); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(5,121,2); ? 从Root往树末梢递归 select * from TBL_TEST ?start with id=1 ?connect by prior id = pid ? 从末梢往树ROOT递归 select * from TBL_TEST ?start with id=5 ?connect by prior pid = id ? connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start by cond1 connect by cond2 where cond3; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段 : id,parentid 那么通过表示每一条记录的 parent 是谁,就可以形成一个树状结构。 用上述语法的查询可以取得这棵树的所有记录。 其中 COND1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 COND2 是连接条件,其中用 PRIOR 表示上一条记录,比如 CONNECT BY PRIOR ID=PRAENTID 就是说上一条记录的 ID 是本条记录的 PRAENTID ,即本记录的父亲是上一条记录。 COND3 是过滤条件,用于对返回的所有记录进行过滤。 PRIOR 和 START WITH 关键字是可选项 PRIORY 运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系, PRIOR 运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是 自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。 START WITH 子句为 可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询 条件的行作为根节点。 完整的例子如 SELECT PID,ID,NAME FROM?T_WF_ENG_WFKIND START WITH PID =0 CONNECT BY PRIOR?ID =?PID ? 以上主要是针对上层对下层的顺向递归查询而使用start with?... connect by prior ...这种方式,但有时在需求需要的时候,可能会需要由下层向上层的逆向递归查询,此是语句就有所变化:例如要实现 select * from table where id in (0,01,0101,0203,0304) ;现在想把0304的上一级03给递归出来,0203的上一级02给递归出来,而01现在已经是存在的,最高层为0.而这张table不仅仅这些数据,但我现在只需要(0,01,0101,0203,0304,02,03)这些数据,此时语句可以这样写SELECT PID,ID,NAME FROM V_WF_WFKIND_TREE WHERE ID IN (SELECT DISTINCT(ID) ID FROM V_WF_WFKIND_TREE CONNECT BY PRIOR?PID =?ID START WITH ID IN (0,01,0101,0203,0304)?); 其中START WITH ID IN里面的值也可以替换SELECT 子查询语句. ? 注意由上层向下层递归与下层向上层递归的区别在于START WITH...CONNECT BY PRIOR...的先后顺序以及?ID =?PID 和?PID =?ID 的微小变化! ? for example: 树结构查询语句(START WITH ...CONNECT BY P

文档评论(0)

liwenhua00 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档