首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ORACLE:根据父id查询所有子孙数据,或者根据子id查询所有父数据(start with connect by prior)

一、需求: 我们在开发中经常遇到一种数据库表的设计:一个表中包含父子信息数据,也就是常说的树形数据. ---> 最常见的例子就是省市区一体表,就是通过id、pid、level来进行控制,从而一张表来存储数据....我们进行拿数据的时候,不用再连表拿取,直接通过(start with connect by prior)直接便利就会得到数据....需求:我输入山东省的id,会把山东省及下面的市区都查询出来 select * from REGION start with id = 2 connect by prior id = pid -- prior...右边是子级id,就往子级的方向查询 ORDER BY id; 结果展示 四、根据id查询所有的父数据 需求:我输入黄岛区的id,会把黄岛区及其所在的市省国查询出来 select * from REGION...start with id = 8 connect by prior pid = id -- prior 右边是父id,就往父级的方向查询 ORDER BY id; 结果展示 五、总结 主要是列举这两种比较常用的写法

2.6K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Oracle递归查询:使用prior实现树操作

    oracle树查询的最重要的就是select…start with…connect by…prior语法了。依托于该语法,我们可以将一个表形结构的数据以树的顺序列出来。...select * from tb_menu m start with m.id=38 connect by prior m.parent=m.id; 这里查找的就是id为1的所有直属父节点,打个比方就是找到一个人的父亲...当parent = prior id时,数据库会根据当前的id迭代出parent与该id相同的记录,所以查询的结果是迭代出了所有的子类记录;而prior parent = id时,数据库会跟据当前的parent...12)、列出当前节点是否为叶子。 这个比较常见,尤其在动态目录中,在查出的内容是否还有下级节点时,这个函数是很适用的。...至此,oracle树型查询基本上讲完了,以上的例子中的数据是使用到做过的项目中的数据,因为里面的内容可能不好理解,所以就全部用一些新的例子来进行阐述。

    2.1K50

    Vue如何在父级下使用v-slot的值

    关于作用域插槽v-slot的用法可以先看看文档 https://cn.vuejs.org/v2/guide/components-slots.html#%E4%BD%9C%E7%94%A8%E5%...9F%9F%E6%8F%92%E6%A7%BD 现在我们进入正题 我们用到一个第三方组件validate,这个第三方组件的插槽传了一个属性error值给我们,我们现在想要在父级中获得这个error值,...我们觉得可以在v-slot下使用一个方法,把error传到父级去,不就行了吗,的确是可以的: https://jsfiddle.net/jswenjie/pxru6y2m/5/ 问题出现 我们的页面有多个...validate的情况下,需要搜集所有的error,那么我们可以用个数组:https://jsfiddle.net/jswenjie/pxru6y2m/7/ 我们发现虽然结果是正确的,不过在控制台下出现了...有死循环的问题。 问题解决 为了解决这个问题,我考虑到是否可以用一个组件把 父级和子集关联起来呢,相当于给他们搭建一个桥梁,结果证明是可以的,就是略显繁琐,不知道大家有没有更好的方法呢?

    1.6K20

    Oracle应用之sys_connect_by_path用法

    , sys_connect_by_path函数是将递归查到的数据加上特定的符号,看起来更明显 connect by递归查询配合sys_connect_by_path基本语法是: select sys_connect_by_path...prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,就表示pid就是这条记录的根节点了 sys_connect_by_path...第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符!...by prior empno = mgr; 可能遇到的报错,ORA-30004:使用SYS_CONNECT_BY_PATH函数时,不能将分隔符作为列值的一部分 原因是当使用SYS_CONNECT_BY_PATH...函数时,不能将分隔符作为字段值的一部分 假如这样的sql,ename里面有@这个字符,就会报错,方法是修改sql换个字符,或者改数据 select sys_connect_by_path(ename,

    21450

    Oracle函数sys_connect_by_path用法

    , sys_connect_by_path函数是将递归查到的数据加上特定的符号,看起来更明显 connect by递归查询配合sys_connect_by_path基本语法是: select sys_connect_by_path...prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,就表示pid就是这条记录的根节点了 sys_connect_by_path...第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符!...可能遇到的报错,ORA-30004:使用SYS_CONNECT_BY_PATH函数时,不能将分隔符作为列值的一部分 原因是当使用SYS_CONNECT_BY_PATH 函数时,不能将分隔符作为字段值的一部分...假如这样的sql,ename里面有@这个字符,就会报错,方法是修改sql换个字符,或者改数据 select sys_connect_by_path(ename, '@') from emp start

    1.4K50

    Oracle数据库 拾漏补缺

    select语句的基本使用 可以查询需要的列,行,可以进行多表链接,连接查询。 select e....*,e.sal/30 from p_emp e select 后面跟的是要显示的结果,可以是通过运算或者连接符号得出的伪列 null  空值 在数据库中不确定的值,未定义的值叫做空值 空值不能引入到运算中...其实等同于表关联后,只取主表部分内容而已,用exists时 小表在前大表在后 connect by 一般用来查找存在父子关系的数据,也就是树形结构的数据;其返还的数据也能够明确的区分出每一层的数据。...select * from table [start with condition1] connect by [prior] id=parentid --这种用法就表示从下往上查找数据,可以理解为从叶子节点往上查找父级几点...,用第一层数据的parentid去跟表记录里面的id进行匹配,匹配成功那么查找出来的就是第二层数据; --上面的那种就是从父级节点往下查找叶子节点。

    87980

    【DB笔试面试478】树形查询(层次查询)可用于哪些场景?

    答案部分 在实际开发中,如果表中数据具有逻辑上的层次结构,那么可以使用层次查询以更直观地显示查询结果(包括数据本身以及数据之间的层次关系)。...CONNECT BY PRIOR 当前表字段=级联表字段 父结点和子结点(父行和子行)间的关联关系> 在使用层次查询的过程中,需要注意以下几点内容: 1、层次查询是通过START WITH和CONNECT...6、CONNECT BY PRIOR是指定父子关系,其中,PRIOR的位置不一定要在CONNECT BY之后,对于一个真实的层次关系,这也是必须的。...8、START WITH与CONNECT BY PRIOR语句完成递归记录,形成一棵树形结构,通常可以在具有层次结构的表中使用。 9、PRIOR和START WITH关键字是可选项。...10、PRIOR运算符必须放置在连接关系的两列中某一个的前面。对于结点间的父子关系,PRIOR运算符所在的一侧表示父结点,等号的另一侧表示子结点,从而确定查找树结构的顺序是自顶向下还是自底向上。

    1.1K20

    使用 Django 显示表中的数据

    1、问题背景当我们使用 Django 进行 Web 开发时,经常需要在 Web 页面上显示数据库中的数据。例如,我们可能需要在一个页面上显示所有用户的信息,或者在一个页面上显示所有文章的标题和作者。...那么,如何使用 Django 来显示表中的数据呢?2、解决方案为了使用 Django 显示表中的数据,我们需要完成以下几个步骤:在 models.py 文件中定义数据模型。...数据模型是 Django 用于表示数据库中数据的类。...例如,如果我们想显示所有用户的信息,那么我们可以在 models.py 文件中定义如下数据模型:from django.db import modelsclass User(models.Model):...例如,如果我们想在一个页面上显示所有用户的信息,那么我们可以在 templates 目录下创建如下 HTML 模板文件:{% extends 'base.html' %}{% block content

    12310

    connect by超乎你想象

    nocycle:若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条循环行:该行只有一个子行,而且子行又是该行的祖先行。...connect_by_iscycle:前置条件:在使用了nocycle之后才能使用此关键字,用于表示是否是循环行,0表示否,1表示是。...connect_by_isleaf:是否是叶子节点,0表示否,1表示是。 level:level伪列,表示层级,值越小层级越高,level=1为层级最高节点。...为了看得更直观,通过lpad函数、level伪列,格式化层级,可以看到a是第一层级,b1和b2是第二层级,其他是第三层级, select id, lead_id, lpad(' ', level*2,...以上介绍的,其实只是connect by一些最基本的使用,connect by的用法上,远不止这些,通过几行SQL,能实现更加复杂的场景。

    58710

    CONNECT BY PRIOR)

    ]]; LEVEL:为伪列,用于表示树的层次 start_condition:层次化查询的起始条件 prior_condition:定义父节点和子节点之间的关系 --使用start with ....empno = 7839记录的相关信息) 3).判断该节点是否存在由子节点,如果则访问最左侧未被访问的子节点,转到),否则下一步 如上例中prior_condition为empno = mgr,即子节点的...mgr等于父节点的empno,在此时mgr为7839的记录 4).当节点为叶节点,则访问完毕,否则,转到) 5).返回到该节点的父节点,转到) --伪列level的使用    --注意connect...by prior中的条件即可,使用mgr = empno)     --注意connect by prior mgr = empno 的理解     --prior表示前一条记录,即下一条返回记录的empno...更多参考: Oracle 数据库实例启动关闭过程 Oracle 10g SGA 的自动化管理 使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例 Oracle实例和Oracle数据库

    49520

    同事问我MySQL怎么递归查询,我懵逼了...

    按照 prior 关键字在子节点端还是父节点端,以及是否包含当前查询的节点,共分为四种情况。...prior 在子节点端(向下递归) 第一种情况:start with 子节点id = ' 查询节点 ' connect by prior 子节点id = 父节点id select * from dept...prior 在父节点端(向上递归) 第三种情况:start with 子节点id= ' 查询节点 ' connect by prior 父节点id = 子节点id select * from dept...' connect by prior pid=id; 这里按照条件 pid='1001',对当前节点的第一代子节点以及它的父节点递归查询。...除此之外,使用 group_concat 函数还有一个限制,就是不能同时使用 limit 。如, ? 本来只想查5条数据来拼接,现在不生效了。 不过,如果需要的话,可以通过子查询来实现, ?

    3K20

    oracle中如何优雅的递归查询

    一条sql怎么查出单表中含有父子关系的数据呢?...( tab.name, '\' ) FROM tab WHERE LEVEL = 3 CONNECT BY PRIOR tab.id = tab.parid image.png 还有其他更优雅的写法吗...id='370883101000' connect by prior parent=id image.png start with子句: 递归的条件,需要注意的是如果with后面的值是子节点那么求出的就是他的父节点和祖宗节点...关键词prior,prior跟它右边的父节点放在一起(prior p.parent)表示往父节点方向遍历, 反之,如果 prior跟子节点放在一起(prior p.id)表示往叶子方向遍历。...这里需要注意的 =p.id 放在prior关键词的前面或者后面都没什么关系,也就是上面可以这样写 p.id= prior p.paren。重要的是prior旁边放的

    10.8K62

    MySQL 如何实现递归查询?「建议收藏」

    按照 prior 关键字在子节点端还是父节点端,以及是否包含当前查询的节点,共分为四种情况。...prior 在子节点端(向下递归) 第一种情况:start with 子节点id = ‘ 查询节点 ‘ connect by prior 子节点id = 父节点id select * from dept...prior 在父节点端(向上递归) 第三种情况:start with 子节点id= ‘ 查询节点 ‘ connect by prior 父节点id = 子节点id select * from dept...' connect by prior pid=id; 这里按照条件 pid=’1001’,对当前节点的第一代子节点以及它的父节点递归查询。...除此之外,使用 group_concat 函数还有一个限制,就是不能同时使用 limit 。如, 本来只想查5条数据来拼接,现在不生效了。

    11.6K10

    Oracle学习笔记整理手册

    PS:本博客收录自己工作中遇到学到的一些Oracle技能,有时间就更新整理一下 (1)Oracle正则匹配使用 PS:这条SQL可以通过正则匹对查询一下,表A的字段a是否有非数字的数据,有时候数据表的一些字段是...第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。...关键词prior,prior跟父节点列parentid放在一起,就是往父结点方向遍历;prior跟子结点列subid放在一起,则往叶子结点方向遍历 https://www.cnblogs.com/benbenduo...select * from 表格1 start with 1=1 connect by id = prior parent_id (16)条件sql case when then else end 可以理解为流程控制语句或条件控制语句...: 开窗函数和row_number函数一起使用的话,就是返回一行,不过这里其实不适合用来统计,因为统计成绩的话,可以存在分数一样的两条数据,而row_number只返回一条数据。

    1K10

    oracle 层次化查询(生成菜单树等)

    1、简介:Oracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的Id)。...(2)、connect by prior ID=pid  当前节点的PID等于上一层节点的ID,如果满足条件,就加入到树结果集中 指定遍历查找子节点的规则----->  这一过程是递归查找,会一层一层找下去...) connect by prior ID=PID ?...结论:根节点的定义比较灵活,但是(connect by)遍历子节点的规则,比较固定基本都是判断父节点和子节点的ID的,如果理解了这句话,层次化查询,差不多也就理解了!...4、  Oracle SQL 中的层次化查询会检测数据中是否存在回环(死循环),如果存在回环,则会抛出 ORA-01436: CONNECT BY loop in user data . 的错误。

    1.5K80
    领券