设为首页 加入收藏

TOP

SQL Server BOM展开方法整理
2014-11-24 07:19:10 来源: 作者: 【 】 浏览:0
Tags:SQL Server BOM 展开 方法 整理

----------------------------------------------------------------------------------

-- Author : htl258(Tony)

-- Date : 2010-07-06 18:33:50

-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)

-- Jul 9 2008 14:43:34

-- Copyright (c) 1988-2008 Microsoft Corporation

-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

-- Blog : http://blog.csdn.net/htl258 (转载保留此信息)

-- Subject: SQL Server BOM展开方法整理

----------------------------------------------------------------------------------

--> 生成测试数据表: [tb]

IF OBJECT_ID([tb]) IS NOT NULL

DROP TABLE [tb]

GO

CREATE TABLE [tb] ([ID] [int],[Name] [nvarchar](10),[PID] [int])

INSERT INTO [tb]

SELECT 1,A,0 UNION ALL

SELECT 2,B,0 UNION ALL

SELECT 3,A1,1 UNION ALL

SELECT 4,B1,2 UNION ALL

SELECT 5,B2,2 UNION ALL

SELECT 6,A11,3 UNION ALL

SELECT 7,A12,3 UNION ALL

SELECT 8,A111,6 UNION ALL

SELECT 9,A112,6 UNION ALL

SELECT 10,A1111,8 UNION ALL

SELECT 11,A1112,8

--SELECT * FROM [tb]

-->SQL查询如下:

--1.BOM展开并按节点深度排序查询方法:

--1.1 SQL2000 指定某节点展开,并按节点深度排序:

IF OBJECT_ID(dbo.f_GetTree) IS NOT NULL

DROP FUNCTION dbo.f_GetTree;

GO

CREATE FUNCTION dbo.f_GetTree

(

@ID AS INT=NULL

)

RETURNS @r TABLE

(

ID INT,

lvl INT,

px VARBINARY(8000)

)

AS

BEGIN

DECLARE @lvl INT

SET @lvl = 0

IF ISNULL(@ID,0)<>0

INSERT @r VALUES(@ID,@lvl,CAST(@ID AS VARBINARY))

ELSE

INSERT @r

SELECT ID, @lvl ,CAST(ID AS VARBINARY)

FROM tb

WHERE PID = 0

WHILE @@rowcount>0

BEGIN

SET @lvl = @lvl+1;

INSERT @r

SELECT a.ID, @lvl ,b.px+CAST(a.ID AS VARBINARY)

FROM tb a

JOIN @r b

ON a.PID = b.ID

AND b.lvl = @lvl-1

END

RETURN;

END

GO

--显示所有节点:

SELECT a.*, b.lvl

FROM tb a

JOIN dbo.f_GetTree(1) b

ON a.ID = b.ID

ORDER BY b.px

--结果:

/*

ID Name PID lvl

----------- ---------- ----------- -----------

1 A 0 0

3 A1 1 1

6 A11 3 2

8 A111 6 3

10 A1111 8 4

11 A1112 8 4

9 A112 6 3

7 A12 3 2

2 B 0 0

4 B1 2 1

5 B2 2 1

(11 行受影响)

*/

--查询指定节点,如显示节点下的所有节点:

SELECT a.*, b.lvl

FROM tb a

JOIN dbo.f_GetTree(2) b

ON a.ID = b.ID

ORDER BY b.px

/*

ID Name PID lvl

----------- ---------- ----------- -----------

2 B 0 0

4 B1 2 1

5 B2 2 1

(3 行受影响)

*/

--1.2 SQL2005 指定某节点展开,并按节点深度排序:

--显示所有节点:

;WITH t AS

(

SELECT ID,lvl=0,px=CAST(ID AS VARBINARY)

FROM tb t

WHERE PID=0

UNION ALL

SELECT a.ID,lvl+1,CAST(px+CAST(a.ID AS VARBINARY) AS VARBINARY)

FROM tb a

JOIN t b

ON a.PID = b.ID

)

SELECT a.*,lvl

FROM tb a

JOIN t b

ON a.ID=b.ID

ORDER BY b.px

/*

ID Name PID &nb

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SQLServer数据库附加失败:错误51.. 下一篇Mysql数据库隔离级别

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)