Sql Server2005 Transact-SQL 新兵器学习总结之-公用表表达式(CTE)

本文介绍了如何使用SQL Server 2005中的CTE(公共表表达式)递归特性来简化复杂数据查询过程,以解决在SQL2000版本中较为繁琐的问题。通过实例演示了查询特定层级数据的方法,突显了CTE在提高查询效率和减少代码复杂性方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://www.cnblogs.com/aierong/archive/2008/07/31/1257250.html

 这些数据存放在表Co_ItemNameSet中,表结构和部分数据如下:

ItemId      ParentItemId ItemName
2           0            管理费用
3           0            销售费用
4           0            财务费用
5           0            生产成本
35          5            材料
36          5            人工
37          5            制造费用
38          35           原材料
39          35           主要材料
40          35           间辅材料
41          36           工资
42          36           福利
43          36           年奖金

现在需求是:我想查询ItemId=2,也就是管理费用和其下属所有节点的信息

通过CTE可以很简单达到需求要的数据

 

 

结果如下:
ItemId ParentItemId ItemName level
2     0             管理费用     1
52     2             汽车费用     2
55     2             招聘费     2
56     2             排污费     2
53     52             燃料          3
54     52             轮胎          3

大家看到sql2000解决这个问题比较麻烦,要实现这需求编写的代码比较多,比较复杂
现在好了,在sql2005中通过CTE的递归特点可以2步就实现.
得到同样的结果,sql2005的CTE代码简单了许多.这就是CTE支持递归查询的魅力。
请看下面的代码:


--sql2005版本
DECLARE @i INT
SELECT @i=2;

WITH Co_ItemNameSet_CTE(ItemId, ParentItemId, ItemName,Level)
AS
(
    SELECT  ItemId, ParentItemId, ItemName ,1 AS [Level]
    FROM  Co_ItemNameSet
    WHERE itemid=@i  
    UNION ALL
    SELECT  c.ItemId, c.ParentItemId, c.ItemName ,[Level] + 1
    FROM  Co_ItemNameSet c  INNER JOIN Co_ItemNameSet_CTE ct
    ON c.ParentItemId=ct.ItemId
)

SELECT * FROM Co_ItemNameSet_CTE
go

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值