利用start with connect by 查询子节点和父节点数据显示为树状形

利用start with   connect by  查询子节点和父节点数据显示为树状形

 

前段时间做了一个根据子节点和父节点查询出树状型

表数据:

要实现的结果:

 

实现的sql:

select rpad('---', (level - 1) * 3, '---') || name as name, id
  from t_nscreen_region
 start with id = 1
connect by nocycle prior id = parent_id 
order SIBLINGS BY id;

 

其中函数理解:

1.PRIOR 
   阶层查询的CONNECY BY condition的条件式需要用到PRIOR来指定父节点
2.CONNECT BY
   通过CONNECT BY子句定义子节点和父节点的关系
3.start with 
   通过start with 指定根节点(不指定start with会出现重复记,不指定NOCYCLE没事)
4.LEVEL 
   通过LEVEL虚拟列表示节点的关系
5.rpad(string,padded_length,[pad_string])函数
   从右边对字符串使用指定的字符进行填充
   string:表示要追加的字符,
   padded_length:表示追加后的长度
   pad_string:表示string字符长度不够padded_length时,取pad_string的字符,默认为空格

6.lpad( string1, padded_length, [ pad_string ] )函数
   从左边对字符串使用指定的字符进行填充
   string1:源字符串
   padded_length:最终返回的字符串的长度,如果最终返回的字符串的长度比源字符串的小,那么此函数实际上对源串进行截断处理
   pad_string:用于填充的字符,可以不填,默认为空字符
7.order SIBLINGS BY id :按id进行排序

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!MySQL 中的 CONNECT BY 子句用于执行层次查询,常用于处理树数据结构。其语法格式为: ``` SELECT ... FROM table_name [WHERE condition] START WITH expr1 CONNECT BY [PRIOR] expr2 = expr3 ``` 其中,`table_name` 是要查询的表名,`condition` 是查询的过滤条件,`expr1` 是起始节点条件,`expr2` 是当前节点与父节点的关系,`expr3` 是当前节点与子节点的关系。 在 CONNECT BY 子句中,`START WITH` 表示查询的起始节点条件,可以是任意的表达式。`CONNECT BY` 则用于定义当前节点与父节点子节点之间的关系。如果使用 `PRIOR` 关键字,可以表示当前节点与父节点的关系,否则默认表示当前节点与子节点的关系。 以下是一个示例: ``` SELECT employee_name, manager_name, level FROM employees START WITH employee_name = 'Alice' CONNECT BY PRIOR employee_name = manager_name; ``` 该查询语句将从 `employees` 表中查询 Alice 的直接和间接下属,以及每个下属所处的层级。其中,`START WITH employee_name = 'Alice'` 表示起始节点为 Alice,`CONNECT BY PRIOR employee_name = manager_name` 表示当前节点与父节点的关系为员工名等于上级经理名。 希望能对您有所帮助! ### 回答2: MySQL中的`start with connect by`是一种在查询语句中实现递归的方式。该语法基于标准的SQL-99中的“WITH RECURSIVE”语法,但在MySQL使用稍有不同。 在MySQL中,`start with`指定起始条件,`connect by`指定递归条件。它是通过指定一组与当前行关联的下一级行来实现递归的。 下面是一个示例,说明如何使用`start with connect by`语法: 假设我们有一个简单的表格`departments`,包含部门的名称(`name`)和父部门的ID(`parent_id`)。我们想要查询所有部门及其子部门的名称。我们可以使用以下查询: ``` WITH RECURSIVE department_hierarchy AS ( SELECT name, id, parent_id FROM departments WHERE parent_id IS NULL #起始条件 UNION ALL SELECT d.name, d.id, d.parent_id FROM departments d JOIN department_hierarchy dh ON d.parent_id = dh.id #递归条件 ) SELECT * FROM department_hierarchy; ``` 在上面的语句中,`start with`条件是`parent_id IS NULL`,它选择顶层部门,也就是没有父部门的部门作为起始条件。`connect by`条件是`d.parent_id = dh.id`,它链接了当前部门(`d`)到它的父部门(`dh`),即通过`parent_id`和`id`来实现递归。 使用`start with connect by`语法可以轻松地查询嵌套结构数据,比如组织结构、文件系统等等。在实现递归的过程中,要注意避免死循环和过度递归,以免导致性能问题。 ### 回答3: MySQL中的start with和connect by模块可以用于实现基于层次结构查询,这种查询通常用于处理树数据结构。start with关键字用于指定起始节点,而connect by子句用于指定两个列之间的关联关系。 start with子句用于在查询中指定起始节点,其语法为: SELECT column1, column2, … FROM table_name START WITH condition; 其中,condition是一个布尔表达式,用于筛选符合条件的起始节点。例如,查询员工表中所有子部门为“Accounting”的员工的查询语句为: SELECT employee_name FROM employees START WITH department_name = 'Accounting' CONNECT BY PRIOR employee_id = manager_id; 上述查询中,start with子句指定了起始节点为所有子部门为“Accounting”的员工,connect by子句指定了两个列之间的关联关系。PRIOR关键字用于指定当前行与上一行之间的父子关系,employee_id列是当前行的子部门,而manager_id列是上一行的部门负责人。 上述查询结果的输为一个树结构,其中每个节点都是一位员工的名称,它的子节点是直接受其管理的员工。如果一个员工没有下属,则该节点下无子节点。在查询过程中,MySQL会逐个扫描树结构,按照从顶层到底层的顺序进行遍历,将每个节点的信息输到结果集中。 在实际的应用中,start with和connect by模块可以用于处理许多基于层次结构的业务场景,例如组织机构、产品分类、地理位置等。通过灵活运用这些模块,可以轻松实现树查询,提高数据处理的效率和精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值