公用表表达式是Sql Server2005中新增的。公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。
可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。
CTE可用于:
CTE优点:
CTE可使用的范围:
例1,把test表中salary最大的id记录保存在test_CTE中,再调用
复制代码代码示例:
with test_CTE(id,salary)
as ( select id ,max(salary) from test group by id ) select * from test_cte
从上面的代码,可以看出:
我个人认为cte最好用的地方是创建递归查询,下面演示一下这功能:
现在需求是:我想查询ItemId=2,也就是管理费用和其下属所有节点的信息
复制代码代码示例:
--sql2000版本
/*
/*
INSERT INTO #tem([ItemId],[level])
INSERT INTO #list([ItemId],[ParentItemId],[ItemName],[level])
DECLARE @level INT
DECLARE @current INT
/*
IF @@ROWCOUNT>0
--将其所有子项目添加到堆栈的下一级 (@level + 1) 中。
--将其所有子项目添加
IF @@rowcount>0
--显示结果
DROP TABLE #tem
结果如下:
在sql2005中通过CTE的递归特点可以2步就实现.
例子:
复制代码代码示例:
--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 (责任编辑:IT) |