理解 with递归调用 Sqlserver 树查询

--with用法
--可以这么理解

with SQL语句变量或者叫临时表名 as(
    SQL语句
)
select * from SQL语句变量或者叫临时表名

 

--递归调用
with CTE as(
    select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
    union all
    select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a inner join CTE on a.ParentId=CTE.ZTBM_ID
)
select * from CTE
--此语句可以理解如下

 

--同上一个语句
    --最顶层 1
    select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
    union all
    select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a 
    inner join --此处括弧可以理解为最顶层的CTE   此处红色CTE即上一个SQL语句的CTE
    (
        --第二层
        select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
        union all
        select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a 
        inner join --此处括弧可以理解为第二层的CTE
        (
            --第三层
            select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
            union all
            select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a 
            inner join 
            (
                --第四层
                select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
                union all
                select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a 
                inner join 
                (
                    select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
                    --inner join....    层层嵌套
                    --最底层
                )
                CTE on a.ParentId=CTE.ZTBM_ID
            )
            CTE on a.ParentId=CTE.ZTBM_ID
            
            
        )
        CTE on a.ParentId=CTE.ZTBM_ID
    )
    CTE on a.ParentId=CTE.ZTBM_ID

 变异如下查询(排序,及分割)

with CTE as    
(     
-->Begin 一个定位点成员     
 select ZTBM_ID, ztbm_name,ParentId,cast(ztbm_name as nvarchar(max)) as TE,  
        ROW_NUMBER()over(order by getdate()) as OrderID,0 as Levle  
        from TB_ZYM_ZTBM where  deleteMark=1 and (ParentId is null or ParentId='') 
-->End      
union all     
-->Begin一个递归成员     
 select TB_ZYM_ZTBM.ZTBM_ID, TB_ZYM_ZTBM.ztbm_name,TB_ZYM_ZTBM.ParentId,cast(replicate('  ',Levle+1)+'|_'+TB_ZYM_ZTBM.ztbm_name as nvarchar(MAX)) as TE,  
        CTE.OrderID*100+ROW_NUMBER()over(Order by GETDATE()) as OrderID  ,Levle+1 as Levle
        from TB_ZYM_ZTBM inner join CTE     
        on TB_ZYM_ZTBM.ParentId=CTE.ZTBM_ID     
-->End     
)     
select * from CTE  
order by LTRIM(OrderID)

 参考:http://blog.csdn.net/bin_520_yan/article/details/5998349

http://msdn.microsoft.com/zh-cn/library/ms175972(SQL.105).aspx

posted on 2017-07-08 17:21 明净 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/mingjing/p/7137385.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server查询是一种在关系型数据库中使用归算法进行数据查询的方法。它可以用于处理具有层次结构的数据,例如组织结构、形结构等。在SQL Server中,查询可以通过使用公共表表达式(CTE)和归联接来实现。 查询的基本思想是通过归联接将一个表与自身连接,从而实现对层次结构数据的遍历和查询。在查询中,需要定义一个归部分和一个终止条件。 下面是一个示例,演示如何使用查询在SQL Server中查询组织结构的层级关系: ```sql -- 创建一个示例表 CREATE TABLE Organization ( ID INT, Name VARCHAR(50), ParentID INT ); -- 插入示例数据 INSERT INTO Organization (ID, Name, ParentID) VALUES (1, '公司', NULL), (2, '部门A', 1), (3, '部门B', 1), (4, '小组A1', 2), (5, '小组A2', 2), (6, '小组B1', 3); -- 使用查询获取组织结构的层级关系 WITH RecursiveCTE AS ( SELECT ID, Name, ParentID, 0 AS Level FROM Organization WHERE ParentID IS NULL UNION ALL SELECT o.ID, o.Name, o.ParentID, Level + 1 FROM Organization o INNER JOIN RecursiveCTE r ON o.ParentID = r.ID ) SELECT ID, Name, Level FROM RecursiveCTE ORDER BY Level, ID; ``` 上述示例中,我们首先创建了一个名为Organization的表,用于存储组织结构数据。然后插入了一些示例数据。接下来,使用查询通过归联接获取组织结构的层级关系。在查询中,我们使用了一个公共表表达式(CTE)来定义归部分和终止条件。最后,通过查询RecursiveCTE表获取结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值