`
zhuqing08
  • 浏览: 2749 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

SQL 树查询

阅读更多
原始数据:select no,q from a_example2

NO         NAME
---------- ------------------------------
001        a01
001        a02
001        a03
001        a04
001        a05
002        b01
003        c01
003        c02
004        d01
005        e01
005        e02
005        e03
005        e04
005        e05

需要实现得到结果是:
001   a01;a02;a03
002   b01
003  c01;c02
004  d01
005  e01;e02;e03;e04;e05

思路:
1、ORACLE8.1之后有个connect by 子句,取出整棵树数据。
create table a_example1
(
no char(3) not null,
name varchar2(10) not null,
parent char(3)
)

//增加模拟数据
insert into a_example1
values('001','老王',null)

insert into a_example1
values('101','老李',null)

insert into a_example1
values('002','大王1','001')

insert into a_example1
values('102','大李1','101')

insert into a_example1
values('003','大王2','001')

insert into a_example1
values('103','大李2','101')

insert into a_example1
values('003','小王1','002')

insert into a_example1
values('103','小李1','102')

NO  NAME PARENT
001 老王
101 老李
002 大王1 001
102 大李1 101
003 大王2 001
103 大李2 101
003 小王1 002
103 小李1 102


//按照家族树取数据
select * from a_example1

select level,sys_connect_by_path(name,'/') path
            from a_example1
            start with /*name = '老王' and*/ parent is null
            connect by parent = prior no
结果:
1  /老王
2  /老王/大王1
3  /老王/大王1/小王1
2  /老王/大王2
1  /老李
2  /老李/大李1
3  /老李/大李1/小李1
2  /老李/大李2

按照上面思路,我们只要将原始数据做成如下结构:
NO        NAME
001        a01
001       a01/a02
001       a01/a02/a03
001       a01/a02/a03/a04
001       a01/a02/a03/a04/a05
002        b01
003       c01
003        c01/c02
004        d01
005        e01
005        e01/e02
005        e01/e02/e03
005        e01/e02/e03/e04
005        e01/e02/e03/e04/e05

最后按NO分组,取最大的一个值即为所需的结果。
NO        NAME
001       a01/a02/a03/a04/a05
002        b01
003        c01/c02
004        d01
005        e01/e02/e03/e04/e05

SQL语句:
select no,max(sys_connect_by_path(name,';')) result from
               (select no,name,rn,lead(rn) over(partition by no order by rn) rn1
               from (select no,name,row_number() over(order by no,name desc) rn from a_example2)
               )
        start with rn1 is null connect by rn1 = prior rn
group by no


语句分析:
1、 select no,name,row_number() over(order by no,name desc) rn from a_example2
按照NO升序排序,同时按照NAME降序排序,产生伪列,目的是要形成树结构
NO  NAME RN
001 a03 1
001 a02 2
001 a01 3
002 b01 4
003 c02 5
003 c01 6
004 d01 7
005 e05 8
005 e04 9
005 e03 10
005 e02 11
005 e01 12

2、select no,name,rn,lead(rn) over(partition by no order by rn) rn1
from ( select no,name,row_number() over(order by no,name desc) rn from a_example2)
生成家族谱,即子节点与父节点有对应关系,对应关系通过rn和 rn1。其中lead为上一条记录的RN值
NO  NAME RN  RN1 
001 a03 1 2  --说明:针对NO=001来说,其下一条记录的RN=2
001 a02 2 3 --说明:针对NO=001来说,其下一条记录的RN=3
001 a01 3  --说明:针对NO=001来说,其下一条记录的RN IS NULL
002 b01 4
003 c02 5 6
003 c01 6
004 d01 7
005 e05 8 9
005 e04 9 10
005 e03 10 11
005 e02 11 12
005 e01 12


3、select no,sys_connect_by_path(name,';') result from
       (select no,name,rn,lead(rn) over(partition by no order by rn) rn1
from ( select no,name,row_number() over(order by no,name desc) rn from a_example2))
       start with rn1 is null connect by rn1 = prior rn
正式生成树 
NO   RESULT
001 ;a01
001 ;a01;a02
001 ;a01;a02;a03
002 ;b01
005 ;e01
005 ;e01;e02
005 ;e01;e02;e03
005 ;e01;e02;e03;e04
005 ;e01;e02;e03;e04;e05
003 ;c01
003 ;c01;c02
004 ;d01

将上面结果按照NO分组,取result最大值即可,所以将上述语句改为
select no,max(sys_connect_by_path(name,';')) result from
               (select no,name,rn,lead(rn) over(partition by no order by rn) rn1
               from (select no,name,row_number() over(order by no,name desc) rn from a_example2)
               )
        start with rn1 is null connect by rn1 = prior rn
group by no
得到所需结果。
分享到:
评论

相关推荐

    SQL 查询树形子节点.

    sql 查询 所有子节点 方法已经调试通过(sql-server 2005)

    用SQL实现树的查询

    ### 用SQL实现树的查询 #### 背景与概念 在计算机科学中,**树形结构**是一种常见的非线性数据结构,用于表示层级关系。这种结构在现实世界中有许多应用,如家谱、组织结构图等。在数据库管理中,尤其是在关系型...

    SQL 高级查询技术

    SQL高级查询技术是数据库管理中不可或缺的一部分,它涵盖了多种复杂操作,使得数据处理更为高效和精确。本章主要探讨三个核心主题:日期和时间处理、层次查询以及分析查询,这些都是Oracle Database 10g系统中重要的...

    部分普通sql查询在hive中的实现方式

    ### 部分普通SQL查询在Hive中的实现方式 Hive是一款基于Hadoop的数据仓库工具,能够对存储在Hadoop文件系统中的数据集进行数据提取、转换、加载(ETL),这是一种可以简化MapReduce编程的工具。由于Hive的设计初衷...

    C++ SQL生成语法树

    在实际应用中,这样的解析系统可以帮助我们更好地理解和优化SQL查询,例如,通过分析语法树来找出性能瓶颈,或者生成SQL语句的可视化表示,便于理解和调试。 总结起来,"C++ SQL生成语法树"是一个涉及词法分析、...

    SqlServer树形结构、层次查询

    SqlServer树形结构、层次查询 结果如下: 1 1 2 1-2 4 1-2-4 5 1-2-5 10 1-2-5-10 8 1-2-5-8 6 1-2-6 3 1-3 7 1-3-7 11 1-3-7-11 9 1-3-7-9 12 1-3-7-9-12 13 1-3-7-9-13 14 1-3-7-9-14

    sqlserver查询分析器免安装版

    SQL Server查询分析器是Microsoft SQL Server数据库管理系统的重要组成部分,它为数据库管理员和开发人员提供了用于编写、测试和执行SQL查询的界面。免安装版本的SQL Server查询分析器为那些不希望或不能在计算机上...

    mysql 树形结构查询

    mysql 树形结构查询 MySQL 树形结构查询是指使用存储过程来实现 MySQL 数据库中的树形结构查询。这种查询方式可以高效地查询树形结构的数据,并且可以根据需要设置递归深度。 MySQL 中的树形结构查询可以使用存储...

    CSharp-SQL.rar_C# sql 查询 txt_C#不让sql换行_c# SQL 树形列表_c# sqlserver操

    本文将深入探讨C#中的SQL查询技术,如何处理SQL语句的换行问题,以及如何创建和展示SQL数据的树形列表。 首先,"CSharp-SQL.rar"是一个压缩包,其中包含了一系列关于C#与SQL交互的实例代码,这可以帮助开发者更好地...

    sql树形数据处理示例

    总结来说,处理SQL中的树形数据需要对递归查询、CTEs以及表自连接等概念有深入理解。通过灵活运用这些技术,我们可以有效地在数据库中构建和查询层级关系,满足各种业务需求。在实际项目中,应根据数据规模和查询...

    sql server 2008 递归查询所有上级或下级数据

    在SQL Server 2008中实现递归查询来获取所有上级或下级数据是一项非常实用的技术,尤其是在处理具有层次结构的数据时。本篇将详细解释如何利用Common Table Expressions (CTE)来完成这样的查询,并对提供的示例代码...

    sql树形结构使用with

    ### SQL树形结构使用WITH详解 在软件开发过程中,树形结构是非常常见的一种数据组织方式。尤其是在处理具有层级关系的数据时,例如组织架构、产品分类等场景,利用SQL实现树形结构可以极大地提高查询效率与数据管理...

    SQL Server 2005中的SQL简单查询

    ### SQL Server 2005中的SQL简单查询详解 #### 实验目的与内容解析 **实验目的** 1. **掌握SQL Server 2005中附加数据库的方法:** 在SQL Server 2005中,附加数据库是一项基本操作,允许用户将现有的数据库文件...

    基于SQL语法树的SQL注入过滤方法研究.pdf

    【SQL注入攻击】是Web应用程序安全领域中的一个严重威胁,攻击者通过构造恶意的...未来的研究可能涉及进一步优化语法树构建和比较算法,以及结合其他安全技术,如参数化查询、输入验证等,以提升整体的安全防护能力。

    SQL 递归查询,并将结果集保存在临时表中

    在SQL中,递归查询是一种强大的工具,常用于处理层级数据,例如组织结构、树形菜单等。在给定的场景中,我们需要根据一个特定的节点ID查询出该节点及其所有子节点,并将这些结果存储在一个临时表中。以下是实现这一...

    树查询的SQL语句

    一个属性数据库表,利用sql语句对其查询得到树形的数据库表的记录利用的是数据库的递归查询

    CTE树形菜单递归查询 .sql

    sql查询tree树,使用的是cte 递归!

    ORACLE中SQL查询优化技术

    - **索引类型选择**:根据查询特点选择最合适的索引类型,如B树索引、位图索引等。 - **多列索引**:当查询条件涉及多个字段时,考虑创建多列索引以提高查询效率。 - **索引统计信息更新**:定期更新索引统计信息...

Global site tag (gtag.js) - Google Analytics