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

原创 2005年07月27日 16:55:00

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 nvarchar(20))
INSERT [tb] SELECT  1,0,N'中国'
UNION  ALL  SELECT  2,0,N'美国'
UNION  ALL  SELECT  3,0,N'加拿大'
UNION  ALL  SELECT  4,1,N'北京'
UNION  ALL  SELECT  5,1,N'上海'
UNION  ALL  SELECT  6,1,N'江苏'
UNION  ALL  SELECT  7,6,N'苏州'
UNION  ALL  SELECT  8,7,N'常熟'
UNION  ALL  SELECT  9,6,N'南京'
UNION  ALL  SELECT 10,6,N'无锡'
UNION  ALL  SELECT 11,2,N'纽约'
UNION  ALL  SELECT 12,2,N'旧金山'
GO

-- 查询指定id的所有子

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_cid]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_cid]
GO
-- =====================================================
-- 查询指定id的所有子
-- 邹建 2005-07(引用请保留此信息)

-- 调用示例

/*--调用(查询所有的子)
    SELECT A.*,层次=B.[level] 
    FROM [tb] A,f_cid(2)B
    WHERE A.[id]=B.[id]
--*/
-- =====================================================
CREATE FUNCTION f_cid(@id int)
RETURNS TABLE
AS
RETURN(
    WITH ctb([id],[level])
    AS(
        SELECT [id],1 FROM [tb]
        WHERE [pid]=@id
        UNION ALL
        SELECT A.[id],B.[level]+1
        FROM [tb] A,ctb B
        WHERE A.[pid]=B.[id])
    SELECT * FROM ctb
    --如果只显示最明细的子(下面没有子),则将上面这句改为下面的
--    SELECT * FROM ctb A
--    WHERE NOT EXISTS(
--        SELECT 1 FROM [tb] WHERE [pid]=A.[id])
)
GO

--调用(查询所有的子)
SELECT A.*,层次=B.[level] 
FROM [tb] A,f_cid(2)B
WHERE A.[id]=B.[id]
GO

-- 查询指定id的所有父

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_pid]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_pid]
GO
-- =====================================================
-- 查询指定id的所有父
-- 邹建 2005-07(引用请保留此信息)

-- 调用示例

/*--调用(查询所有的父)
    SELECT A.*,层次=B.[level] 
    FROM [tb] A,[f_pid](2)B
    WHERE A.[id]=B.[id]
--*/
-- =====================================================
CREATE FUNCTION [f_pid](@id int)
RETURNS TABLE
AS
RETURN(
    WITH ptb([id],[level])
    AS(
        SELECT [pid],1 FROM [tb]
        WHERE [id]=@id
            AND [pid]<>0
        UNION ALL
        SELECT A.[pid],B.[level]+1
        FROM [tb] A,ptb B
        WHERE A.[id]=B.[id]
            AND [pid]<>0)
    SELECT * FROM ptb
)
GO

--调用(查询所有的父)
SELECT A.*,层次=B.[level] 
FROM [tb] A,[f_pid](7)B
WHERE A.[id]=B.[id]
GO

-- 树形分级显示


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_id]
GO
-- =====================================================
-- 级别及排序字段(树形分级显示)
-- 邹建 2005-07(引用请保留此信息)

-- 调用示例

/*--调用实现树形显示

    --调用函数实现分级显示
    SELECT N'|'+REPLICATE('-',B.[level]*4)+A.name
    FROM [tb] A,f_id()B 
    WHERE a.[id]=b.[id]
    ORDER BY b.sid

    --当然,这个也可以根本不用写函数,直接排序即可
    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    
--*/
-- =====================================================
CREATE FUNCTION f_id()
RETURNS TABLE
AS
RETURN(
    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 * FROM stb
)
GO

--调用函数实现分级显示
SELECT N'|'+REPLICATE('-',B.[level]*4)+A.name
FROM [tb] A,f_id()B 
WHERE a.[id]=b.[id]
ORDER BY b.sid
GO

浅谈--数据库 SQL千万级数据处理解决方案

在这个大数据兴起的时代,过亿条的数据的处理已经不少见了。以至于一个处理过程要几个小时的。后面慢慢优化,查找一些经验文章。才学到了一些基本方法。分享一下,由于不是专业的DBA,可能不是最优的解决方案,共...
  • happyduoduo1
  • happyduoduo1
  • 2016-07-05 11:57:27
  • 7747

SQL Server 中树形表数据的处理总结

if object_id('tb_bookInfo') is not null drop table tb_bookInfogocreate table tb_bookInfo(number int,...
  • xys_777
  • xys_777
  • 2010-06-15 16:31:00
  • 7143

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

-- =====================================================-- 直接查询的应用实例-- =============================...
  • zjcxc
  • zjcxc
  • 2005-07-27 17:00:00
  • 5805

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

SQL Server 2005 中的树形数据处理示例 -- 创建测试数据 if exists (select * from dbo.sysobjects where id = object_id(N[...
  • zjcxc
  • zjcxc
  • 2005-07-27 16:55:00
  • 10662

树形数据的处理

/*--表结构描述及数据环境: 表名tb,如果修改表名,则相应修改所有数据处理中涉及到的表名tb id为编号(标识字段+主键),pid为上级编号,name为名称,后面可以自行增加其他字段.  凡是未特...
  • zjcxc
  • zjcxc
  • 2003-12-29 17:27:00
  • 8236

SQL Server 2005 示例数据库

  • 2017年08月25日 13:04
  • 34.7MB
  • 下载

SQL Server 2005示例数据库 安装包 [免费版]

  • 2010年09月30日 13:05
  • 26.25MB
  • 下载

发布一个"文本/文件朗读"小软件

对于经常看小说的人来说,容易眼睛疲劳。Vista 下的语音合成技术已经做得很不错,故此引用此技术写了一个可以朗读文本/文件的小软件。软件使用说明:1. Start  -- 开始朗读: 当 文本框中有数...
  • zjcxc
  • zjcxc
  • 2008-03-10 03:12:00
  • 3902

SQLServer 递归查询

SQLServer 递归查询,主要用于建立树形结构
  • mh942408056
  • mh942408056
  • 2015-04-24 08:18:51
  • 1229

Microsoft SQLServer 2005 示例数据库pubs & northwind的下载和安装

Microsoft SQLServer 2005 示例数据库pubs & northwind的下载和安装1:下载:http://www.microsoft.com/downloads/en/detai...
  • RuizeMa
  • RuizeMa
  • 2011-03-14 09:26:00
  • 1463
收藏助手
不良信息举报
您举报文章:SQL Server 2005 中的树形数据处理示例-1
举报原因:
原因补充:

(最多只允许输入30个字)