代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
MSSQL
】
BOM展开方法整理
作者:
静华
/ 发布于
2017/6/30
/
760
--------------------------------------------------------------------------------- -- 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 <X86> (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 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 行受影响) */ --显示指定节点,如显示节点下的所有节点: ;WITH t AS ( SELECT ID,lvl=0,px=CAST(ID AS VARBINARY) FROM tb t WHERE ID=2 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 lvl ----------- ---------- ----------- ----------- 2 B 0 0 4 B1 2 1 5 B2 2 1 (3 行受影响) */ --2. BOM反查并按节点深度排序查询方法: --2.1 SQL2000 BOM反查,并按节点深度排序: IF OBJECT_ID('dbo.f_GetPTree') IS NOT NULL DROP FUNCTION dbo.f_GetPTree; GO CREATE FUNCTION dbo.f_GetPTree ( @ID AS INT=NULL ) RETURNS @r TABLE ( ID INT, PID INT, lvl INT, px VARBINARY(8000) ) AS BEGIN DECLARE @lvl INT SET @lvl = 0 INSERT @r SELECT ID,PID, @lvl ,CAST(ID AS VARBINARY) FROM tb WHERE ID = @ID WHILE @@rowcount>0 BEGIN SET @lvl = @lvl+1; INSERT @r SELECT a.ID,a.PID, @lvl ,b.px+CAST(a.ID AS VARBINARY) FROM tb a JOIN @r b ON a.ID = b.PID AND b.lvl = @lvl-1 END RETURN; END GO --查询指定节点,如反查节点的所有父节点: SELECT a.*, b.lvl FROM tb a JOIN dbo.f_GetPTree(11) b ON a.ID = b.ID ORDER BY b.px /* ID Name PID lvl ----------- ---------- ----------- ----------- 11 A1112 8 0 8 A111 6 1 6 A11 3 2 3 A1 1 3 1 A 0 4 (5 行受影响) */ --2.2 SQL2005 BOM反查,并按节点深度排序: --查询指定节点,如反查节点的所有父节点: ;WITH t AS ( SELECT ID,PID,lvl=0,px=CAST(ID AS VARBINARY) FROM tb t WHERE ID=11 UNION ALL SELECT a.ID,a.PID,lvl+1,CAST(px+CAST(a.ID AS VARBINARY) AS VARBINARY) FROM tb a JOIN t b ON a.ID = b.PID ) SELECT a.*,lvl FROM tb a JOIN t b ON a.ID=b.ID ORDER BY b.px /* ID Name PID lvl ----------- ---------- ----------- ----------- 11 A1112 8 0 8 A111 6 1 6 A11 3 2 3 A1 1 3 1 A 0 4 (5 行受影响) */
试试其它关键字
同语言下
.
SQL查询 多列合并成一行用逗号隔开
.
查看存储过程修改时间,最近执行时间
.
设置手动批量删除数据库相关进程
.
获取某个表中特定字段的所有字符串形式
.
SQL 如何去除重复的字符串
.
怎么去掉一个字段中的重复数据
.
String 去除空格 回车 换行 水平制表符
.
SQL查询和替换含有回车,空格,TAB
.
SQL SERVER 查询每日新增用户数量、次留数量
.
判断两个字符串是否存在相同的内容
可能有用的
.
SQL查询 多列合并成一行用逗号隔开
.
查看存储过程修改时间,最近执行时间
.
设置手动批量删除数据库相关进程
.
获取某个表中特定字段的所有字符串形式
.
SQL 如何去除重复的字符串
.
怎么去掉一个字段中的重复数据
.
String 去除空格 回车 换行 水平制表符
.
SQL查询和替换含有回车,空格,TAB
.
SQL SERVER 查询每日新增用户数量、次留数量
.
判断两个字符串是否存在相同的内容
静华
贡献的其它代码
(
9
)
.
分词帮助类
.
保存日志
.
BOM展开方法整理
.
在 IMAP 邮件服务器上搜索邮件
.
字符串转十六进制字符串,解决中文乱码问题
.
把数据库表的某一列的数据添加到comboBox中
.
限制选择范围(基于优化目的)
.
iOS KVO注册和监听方法
.
奇数继续偶数退出
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3