`
letitbe
  • 浏览: 235181 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

父子表根据id找到所有的子孙id

    博客分类:
  • sql
阅读更多

     有张表,有两个字段: id,patentid,他们分别记录了这条记录的id,以及父id号,
     如何根据最顶层的id找到所有的id,包括子id,孙子id,以及重孙id.

--用递归查询
SELECT ID, PARENTID FROM tablename 
Start 
With ID = 'xxx' 
Connect 
By Prior ID = ParentId

 以下转自http://blog.csdn.net/apicescn/archive/2007/02/16/1510922.aspx

  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
是过滤条件,用于对返回的所有记录进行过滤。 <o:p></o:p>

PRIORSTART 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 子查询语句.

http://topic.csdn.net/t/20050319/17/3864428.html
     http://blog.csdn.net/Bogues/archive/2005/10/28/518590.aspx

分享到:
评论

相关推荐

    jpa单表递归树形结构实现

    对于单表递归,这意味着所有节点都在同一张表中,通过一个父节点ID字段来标识其子节点。 创建这样的结构,我们需要定义一个实体类,比如`Node`,它包含两个关键属性:`id`作为主键,以及`parentId`来表示父节点。...

    sql树形数据处理示例

    假设我们已经知道一个员工ID,想要找到他的所有上级,可以这样写: ```sql SELECT e1.name AS parent_name FROM employees e1, employees e2 WHERE e1.id = e2.parent_id AND e2.id = ? -- 替换?为子节点ID ...

    Python selenium 父子、兄弟、相邻节点定位方式详解

    其中,根据父子节点关系来定位元素是非常常见的一种场景。 **示例HTML代码**: ```html &lt;div id="A"&gt; &lt;!-- 父节点定位子节点 --&gt; &lt;div id="B"&gt; &lt;div&gt;parent to child ``` **Python代码实现**: ```...

    Oracle通过递归查询父子兄弟节点方法示例

    这个查询将返回ID为101及其所有子孙节点的信息,包括101自身。 2. **查询某节点下所有后代节点(不包含各级父节点)** ```sql SELECT t.* FROM SYS_ORG t WHERE NOT EXISTS (SELECT 1 FROM SYS_ORG s WHERE s....

    左右编码树形结构(附图存储过程)

    生成的视图`treetableview`不仅包含了原始表的所有字段,还添加了`layer`(层数)和`parent`(父节点ID)字段。`layer`字段的计算基于`treelayer`函数,该函数通过计算当前节点的左值和右值之间包含的节点数量来确定...

    JQuery选择器

    - **祖先和子孙选择器**:使用空格分隔两个选择器,例如`$("#divTest a")`,表示选择ID为"divTest"下的所有`&lt;a&gt;`标签。 - **父子节点选择器**:使用`&gt;`来指定直接子元素,例如`$("#divTest &gt; input")`,表示选择ID为...

    SQL Server 公用表表达式(CTE)实现递归的方法

    为了查找指定节点的所有子孙节点,传统方法可能需要使用循环和表变量,如描述中的例子所示。但通过递归CTE,我们可以简化这个过程。以下是如何使用递归CTE来完成相同任务: ```sql WITH RecursiveRole_CTE (Id, ...

    Mysql分层数据管理

    闭包模型的核心优势在于,它能够一次性查询出任意节点的所有子孙节点,而无需进行复杂的递归或自连接操作。这对于构建动态的分类树或产品目录非常有用,可以显著减少数据库的响应时间,提高用户体验。 #### 总结与...

    jQuery选择器全面总结

    1. **ID选择器**: 使用`#`符号后跟元素的ID,如`jQuery("#ID")`,它能够快速准确地找到具有特定ID的唯一元素。由于ID在页面中应该是唯一的,因此ID选择器通常提供最高效率。 2. **元素名称选择器**: 只需指定元素的...

    安卓开发-树形主键.zip

    例如,可以使用递归查询或连接查询来查找特定节点的所有子孙节点。 3. 层级遍历:在安卓UI中展示树形数据时,我们需要遍历这些数据结构,构建出层次分明的视图。这可能涉及到深度优先搜索(DFS)或广度优先搜索...

    使用Vue+Django+Ant Design做一个留言评论模块的示例代码

    - `parent_msg_id`:父留言的ID,用于建立父子留言关系。默认为NULL,表示这是根留言。 - `user_id`:创建该留言的用户ID,与用户表关联。 用户表包含: - `id`:主键,自增整数,唯一标识每个用户。 - `username`...

    mysql 无限级分类实现思路

    在查询时,通过比较相邻节点的右值,可以确定它们的父子关系,并根据数组的大小来决定打印多少个空格,以展示层级差异。这种方法在插入、删除和移动节点时效率较高,且能方便地获取整个树或部分子树。 在实际应用中...

    Laravel开发-tree

    在数据库表中,需要有`lft`和`rgt`字段,以及可能的`parent_id`字段,用于维护树的关系。然后,可以通过Eloquent的关联方法来操作树结构。例如,创建一个新的子节点: ```php $category = Category::create(['name'...

    Vue通过provide inject实现组件通信

    这两个选项一起使用,允许一个祖先组件向其所有子孙后代提供依赖,无论组件层次多深,这些依赖在组件树中的上下游关系一直有效。 `provide`是一个对象或返回一个对象的函数,它定义了祖先组件想要提供给子孙的属性...

    浅析vue中的provide / inject 有什么用处

    1.前言 vue的父子组件通信用什么? :prop和$emit的组合。...这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。 provi

    前端vue经典面试题详细版.doc

    - **Provide/Inject**:允许祖先组件向其所有后代子孙组件注入一个值,而无需显式地一层层传递props。 #### 5. 组件渲染和更新过程 - **初次渲染过程**: - 解析模板为`render`函数。 - 触发响应式机制,监听`...

    H5前端面试题,内含答案

    - 节点关系:兄弟、父子、子孙、前后等关系的识别与利用。 - DOM操作方法:appendChild、removeChild、cloneNode、createElement、getElementById等。 - **事件模型**:标准DOM事件模型与IE事件模型的区别。 - **...

    Vue 构造选项 - 进阶使用说明

    通过`Vue.extend()`可以创建一个基于现有组件的新组件,新组件会继承原有组件的所有选项。局部使用时,可以在`options.extends`中指定父组件。虽然在实际工作中较少使用,但在某些场景下可以简化代码结构。 4. ...

Global site tag (gtag.js) - Google Analytics