SQL Server 2005 中的树形数据处理示例-2

server|示例|数据

-- =====================================================
-- 直接查询的应用实例
-- =====================================================

-- 1. 每个叶子结点的 FullName
WITH stb([id],[FullName],[pid],[flag])
AS(
    SELECT [id],CAST(RTRIM([name]) as nvarchar(4000)),[pid],1
    FROM [tb] A
    WHERE NOT EXISTS(
        SELECT 1 FROM [tb]
        WHERE [pid]=A.[id])
    UNION ALL
    SELECT A.[id],RTRIM(B.[name])+'/'+A.[FullName],B.[pid],A.flag+1
    FROM stb A,[tb] B
    WHERE A.[pid]=B.[id])
SELECT [id],[FullName] FROM stb A
WHERE NOT EXISTS(
    SELECT * FROM stb
    WHERE [id]=A.[id]
        AND flag>A.flag)
ORDER BY [id]
GO

-- 2. 每个结点的 FullName
WITH stb([id],[FullName],[pid],[flag])
AS(
    SELECT [id],CAST(RTRIM([name]) as nvarchar(4000)),[pid],1
    FROM [tb]
    UNION ALL
    SELECT A.[id],RTRIM(B.[name])+'/'+A.[FullName],B.[pid],A.flag+1
    FROM stb A,[tb] B
    WHERE A.[pid]=B.[id])
SELECT [id],[FullName] FROM stb A
WHERE NOT EXISTS(
    SELECT * FROM stb
    WHERE [id]=A.[id]
        AND flag>A.flag)
ORDER BY [id]
GO

-- 3. 树形显示数据
WITH stb([id],[level],[sid])
AS(
    SELECT [id],1,CAST(RIGHT(10000+[id],4) as varchar(8000))
    FROM [tb]
    WHERE [pid]=0
    UNION ALL
    SELECT A.[id],B.[level]+1,B.sid+RIGHT(10000+A.[id],4)
    FROM [tb] A,stb B
    WHERE A.[pid]=B.[id])
SELECT N'|'+REPLICATE('-',B.[level]*4)+A.name
FROM [tb] A,stb B
WHERE a.[id]=b.[id]
ORDER BY b.sid   
GO

-- 4. 检查不规范的数据
WITH chktb([id],[pid],[level],[Path],[Flag])
AS(
    SELECT [id],[pid],1,
        CAST([id] as varchar(8000)),
        CASE WHEN [id]=[pid] THEN 1 ELSE 0 END
    FROM [tb]
    UNION ALL
    SELECT A.[id],B.[pid],B.[level]+1,
        CAST(B.[Path]+' > '+RTRIM(A.[id]) as varchar(8000)),
        CASE WHEN A.[id]=B.[pid] THEN 1 ELSE 0 END
    FROM [tb] A,chktb B
    WHERE A.[pid]=B.[id]
        AND B.[Flag]=0)
SELECT * FROM chktb
WHERE [Flag]=1
ORDER BY [Path]   
GO

-- 5. 查询结点的所有子结点数
WITH sumtb([id],[level])
AS(
    SELECT [pid],1
    FROM [tb] A
    WHERE [pid]<>0
    UNION ALL
    SELECT A.[pid],B.[level]+1
    FROM [tb] A,sumtb B
    WHERE A.[id]=B.[id]
        AND A.[pid]<>0)
SELECT A.[id],ChildCounts=COUNT(b.[id])
FROM [tb] A
    LEFT JOIN sumtb B
        ON A.[id]=B.[id]
GROUP BY A.[id]
GO

-- 6. 查询结点的所有父结点数
WITH sumtb([id],[level],[ParentCounts])
AS(
    SELECT [id],1,0
    FROM [tb] A
    WHERE [pid]=0
    UNION ALL
    SELECT A.[id],B.[level]+1,B.[ParentCounts]+1
    FROM [tb] A,sumtb B
    WHERE A.[pid]=B.[id])
SELECT * FROM sumtb
order by [ID]
GO

 

时间: 2024-10-30 05:50:24

SQL Server 2005 中的树形数据处理示例-2的相关文章

SQL Server 2005 中的树形数据处理示例-1

server|示例|数据 SQL Server 2005 中的树形数据处理示例 -- 创建测试数据 if exists (select * from dbo.sysobjects where id = object_id(N'[tb]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)    drop table [tb]GO -- 示例数据create table [tb]([id] int PRIMARY KEY,[pid] int,name nvar

使用 SQL Server 2005中的 CLR 集成

本文描述了数据库应用程序开发人员和架构师如何利用 SQL Server 2005 中的 CLR 集成功能.本文对基于 CLR 的编程方式与 SQL Server 中支持的现有编程模型(如 TransacT-SQL 和扩展存储过程)进行了比较,并且强调了各自相对的优缺点.还提供了一组选择合适的编程替代方法的高级指导,以及一些示例和代码示例. 一.简介 Microsoft 通过宿主 Microsoft .NET Framework 2.0 公共语言运行库 (CLR),SQL Server 2005显

Microsoft SQL Server 2005 中的 XML 选项

本文介绍 Visual Studio 2005/SQL Server 2005 环境中用于处理 XML 数据的三个选项,包括使用方案以及指导用户在各选项之间进行选择的指南. 一.System.Xml.SQLXML 和 XML 数据类型简介 本节简要介绍 Microsoft SQL Server 2000 中提供的 XML 支持的发展历史,并概要介绍 Microsoft Visual Studio 2005/SQL Server 2005 环境中提供的用于处理 XML 和关系数据的三个选项.这三个

SQL Server 2005 中的商务智能和数据仓库(2)

例如,设想一个"客户"维度.关系型源表有八列: • 客户键 • 客户名称 • 年龄 • 性别 • 电子邮件 • 城市 • 地区 • 国家 相应的 Analysis Services 维度应具有七个属性: • 客户(整型键.以"客户名称"作为名称) • 年龄.性别.电子邮件.城市.地区.国家 数据中存在一种自然层次结构,{国家.地区.城市.客户}.出于导航目的,应用程序开发人员可以选择创建第二个层次结构:{年龄.性别}.商务用户并没有看到这两个层次结构行为方式之间有何

Microsoft SQL Server 2005 中的 XML 支持(3)

四.SQL Server 2005 中的客户端 XML 处理 XML 数据类型的客户端支持.NET 框架 V2.0 中的 ADO.NET XML 支持 在 SqlDataReader.GetSqlXml() 方法的 System.Data.SqlTypes 命名空间中,XML 数据类型是作为类 SqlXml 公开的.可以使用 SqlXml.CreateReader() 函数从 SqlXml 对象获得 XmlReader. 类型化 XML 列的 XML 架构集合的名称由三部分组成,可以从 XML

Microsoft SQL Server 2005 中的 XML 支持(1)

本文探讨 SQL Server 2005 中内置的 XML 支持.描述了这种支持如何与 .NET 框架 V2.0 和本机代码(例如 OLEDB 和 SQLXML)均支持的客户端编程相集成. 一.简介 可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用.它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的.数据交换已成为 XML 技术的主要驱动力之一.. XML 在企业应用程序中的使用正日益广泛,它主要用于对半结构化和非结构化

SQL Server 2005 中的 Multiple Active Result Set (MARS)

简介 所有 SQL Server 数据访问应用程序编程接口 (API) 都提供了一个抽象来表示会话和会话中的请求.SQL Server 2000 以及更早的版本限制编程模型,它要求任何时候一个给定的会话中最多只能有一个待定的请求.有几个替代办法被用来解决这种限制,在这些替代办法中,最常见的可能就是服务器端光标.SQL Server 2005 实现了 Multiple Active Result Set (MARS),它解除了这个约束.本文介绍了 MARS 的设计.结构和语义变更,以及为了从这些改

SQL Server 2005 中的批编译、重新编译和计划缓存问题(4)

下面,考虑以下 T-SQL 代码段:-- dbo.someTable will be used to populate a temp table-- subsequently.create table dbo.someTable (a int not null, b int not null)godeclare @i intset @i = 1while (@i <= 2000)begin insert into dbo.someTable values (@i, @i+5) set @i =

SQL Server 2005 中的批编译、重新编译和计划缓存问题(3)

两种特殊情况 与计划最优性相关的重新编译在下列两种特殊情况中的处理方式有所不同. 特殊情况 1:在空表或索引视图上创建的统计 SQL Server 2005 处理下列情况的方式不同于 SQL Server 2000.用户创建了一个空表 T.然后又在 T 一个或多个列上创建了一个统计 S.由于 T 为空,因此统计二进制大对象(直方图)为 NULL,但已经在 T 上创建了统计.假设在查询编译期间已发现 S 是"令人关注的".根据重新编译阈值的"500 行"规则,只有至少