SQL Server 2005 树形数据处理示例

 
 

 

-- =====================================================
-- SQL Server 2005 中的树形数据处理示例
-- 作者: 邹建

-- =====================================================
 
 
ContractedBlock.gif ExpandedBlockStart.gif 创建测试数据
 
   
-- =====================================================
--
创建测试数据
--
=====================================================
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

 

-- =====================================================
-- 级别及排序字段(树形分级显示)
-- 直接查询的应用实例
-- =====================================================

 

ContractedBlock.gif ExpandedBlockStart.gif 1. 每个叶子结点的 FullName
 
   
-- =====================================================
--
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

 

 

ContractedBlock.gif ExpandedBlockStart.gif 2. 每个结点的 FullName
 
   
-- =====================================================
--
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

 

 

ContractedBlock.gif ExpandedBlockStart.gif 3. 树形显示数据
 
   
-- =====================================================
--
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

 

 

ContractedBlock.gif ExpandedBlockStart.gif 4. 检查不规范的数据
 
   
-- =====================================================
--
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

 

 

ContractedBlock.gif ExpandedBlockStart.gif 5. 查询结点的所有子结点数
 
   
-- =====================================================
--
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

 

ContractedBlock.gif ExpandedBlockStart.gif 6. 查询结点的所有父结点数
 
   
-- =====================================================
--
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

 

 

转载于:https://www.cnblogs.com/zhouchaoyi/articles/1782540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值