SQLServer 递归查询

--SQLServer 递归查询,主要用于建立树形结构

IF OBJECT_ID('Categories') IS NOT NULL
    DROP TABLE Categories
GO

CREATE TABLE Categories (
    CategoryID INT,
    CategoryName VARCHAR(20),
    ParentID INT )
GO

INSERT INTO Categories(CategoryID, CategoryName, ParentID)
    SELECT 1, 'Books', NULL UNION ALL
    SELECT 2, 'SQL Server', 1 UNION ALL
    SELECT 3, 'ASP.NET', 1 UNION ALL
    SELECT 4, 'General', 2 UNION ALL
    SELECT 5, 'SSIS', 2 UNION ALL
    SELECT 6, 'TSQL', 2 UNION ALL
    SELECT 7, 'SSRS', 2 UNION ALL
    SELECT 8, 'Beginners', 4 UNION ALL
    SELECT 9, 'Certification Guide', 4
go

WITH cte AS (
    SELECT 0 AS lvl, CategoryID, CategoryName, ParentID,
        CAST(CategoryID AS VARCHAR(128)) AS Sort
    FROM Categories WHERE ParentID IS NULL
    UNION ALL
    SELECT p.lvl + 1, c.CategoryID, c.CategoryName, c.ParentID,
        CAST(p.Sort + '/' + CAST(c.CategoryID AS VARCHAR) AS VARCHAR

(128))
    FROM Categories c
    INNER JOIN cte p ON p.CategoryID = c.ParentID
)
SELECT
    CategoryID,
    SPACE(lvl * 4) + CategoryName AS CategoryName,
    Sort,
    ParentID
FROM cte
ORDER BY Sort

转载于http://beyondrelational.com/modules/2/blogs/28/posts/10486/recursive-cte-and-ordering-of-the-hierarchical-result.aspx

时间: 2024-10-16 00:35:22

SQLServer 递归查询的相关文章

sqlserver递归查询

--递归查询 with cte as ( select a.ID,a.Text, a.Name,a.PID from Menu a where id='2' union all select k.id,k.Text, k.name,k.pid from Menu k inner join cte c on c.id = k.pid )select * from cte

sqlserver 递归查询的一种写法

with tmp as  (  select a.id,a.name,a.pid from tb a where id='003'  union all   select k.id,k.name,k.pid  from tb k inner join tmp c on c.id = k.pid )select * from tmp

关于Oracle、SqlServer 的sql递归查询

递归查询所有子节点 oracle SELECT * FROM hrmdepartment              START WITH  id=22              CONNECT BY PRIOR id=supdepid sqlserver with result_table as               (                  select a.id,a.lastname,a.managerid from hrmresource a where id=321 

SqlServer with递归查询的使用

1.数据准备假定有一个表DiGui,有两个字段Id int ParentId intId ParentId4 05 07 02 18 515 59 714 1130 1523 1541 18104 2342 3039 3053 3967 3988 39107 39 2.目的:通过传入ParentId(=5),返回该记录的所有递归数据,即Id ParentId8 515 530 1523 1542 3039 3053 3967 3988 39107 39 3.Sql语句实现 with temp (

sqlserver实现树形结构递归查询(无限极分类)

SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE仅被定义一次(但在其作用域内可以被引用任意次),并且在该查询生存期间将一直生存.可以使用CTE来执行递归操作.创建的语法是: with <name of you cte>(<column names>) as( <actual query> ) select * from

SqlServer CTE 递归查询 Oracle递归查询

在做数据库设计这块,很多时候表的数据模型就是典型的二叉树结构. 于是在查询数据的时候,就涉及到了数据的递归查询. 递归查询分为两种:1.从根节点查询自身以及所有的子节点:2.从子节点查询自身以及所有的父节点. 下面分别以Oracle 11g 数据库和MsSql 2008 数据库为例,来实现上述两种类型的递归查询 先建一张表 表名: TAdministrative  字段名称  说明  AdministrativeID  行政编号  AdministrativePID  当前行政级别的上一行政级别

sqlserver的CTE实现递归查询

--递归查询 IF OBJECT_ID('DiGui','U') IS NOT NULL DROP TABLE DiGui CREATE TABLE DiGui( Id VARCHAR(50), ParentId VARCHAR(50) ) INSERT INTO dbo.DiGui( Id, ParentId ) select '第三层','第一层' union select '第二层','第一层' union select '第四层','第一层' union select '第十层','第二

SqlServer :实现树形结构递归查询(无限极分类)

SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE仅被定义一次(但在其作用域内可以被引用任意次),并且在该查询生存期间将一直生存.可以使用CTE来执行递归操作. 一.查询树状结构某节点下的所有子节点 with cte_child(id,areaName,pid,level) as ( --起始条件 select id,areaName,pid,0 as le

sqlserver 存储过程 递归查询分组+hierarchyid重建会员关系

CREATE PROCEDURE [dbo].[GetGroupInfo] @s_code NVARCHAR(16) = 0 --会员卡号 AS BEGIN declare @p int; --查询唯一性结果 declare @sql nvarchar(1000); --拼接查询sql字串 set @sql='SELECT @p=n_teamlevel FROM t_user_basic WHERE s_code=' +@s_code; exec sp_executesql @sql,N'@p