来自 数据库 2020-05-07 17:33 的文章
当前位置: 网上澳门金莎娱乐 > 数据库 > 正文

sql多级分类汇总实现介绍

所有人都知道select top 的用法,但很多人还不知道update top 和 delete top 怎么用。以往的做法是set rowcount来指定,其实SQL2005中对于Top语句的增强除了参数化之外还包括对update和delete的支持,但可惜的是还不支持自定义的order by列。如果要自定义派序列可以借助CTE.对于CTE的任何更改都会影响到原始表。我们看下面的测试代码。复制代码 代码如下:set nocount on use tempdb go if (object_id ('tb' ) is not null ) drop table tb go create table tb (id int identity (1 , 1 ), name varchar (10 ), tag int default 0 )insert into tb (name ) select 'a' insert into tb (name ) select 'b' insert into tb (name ) select 'c' insert into tb (name ) select 'd' insert into tb (name ) select 'e' /*--更新前两行 id name tag ----------- ---------- ----------- 1 a 1 2 b 1 3 c 0 4 d 0 5 e 0 */ update top (2 ) tb set tag = 1 select * from tb /*--更新后两行 id name tag ----------- ---------- ----------- 1 a 1 2 b 1 3 c 0 4 d 1 5 e 1 */ ;with t as ( select top (2 ) * from tb order by id desc )update t set tag = 1 select * from tb /*--删除前两行 id name tag ----------- ---------- ----------- 3 c 0 4 d 1 5 e 1 */ delete top (2 ) from tb select * from tb /*--删除后两行 id name tag ----------- ---------- ----------- 3 c 0 */ ;with t as ( select top (2 ) * from tb order by id desc )delete from t select * from tb set nocount off 我会在下一篇文章中介绍一个应用,就是很多人关心的如何独占查询。如果你感兴趣的话可以自己先思考一下,我给一个提示: SQLServer2005有一个关键字Output,它可以将更改和插入的数据输出,我们配合update top就可以模拟出来一个相对高效的独占查询的事物。此功能适合用在并行的任务处理或者消费中。

本文章介绍了关于sql多级分类汇总实现方法及数据结构,有碰到问题的同学可参考一下。

据库结构如下类别表分类id 上级分类id 分类名称 分类级别 排序值

代码如下复制代码 id parentid categoryname categorylevel ordering1 null c1 1 12 1 c11 2 13 1 c12 2 24 1 c13 2 35 1 c14 2 46 2 c111 3 17 2 c112 3 2

然后 内容表是内容id 类别id .........

代码如下复制代码 id categoryid .........1 1 ........2 4 ........3 5 ........

这样处理的弊端是:如果数据量大,子分类很多,达到4级以上,这方法处理极端占用数据库连接池 对性能影响很大。

如果用SQL下面的CTE递归处理的话,一次性就能把结果给查询出来,而且性能很不错 比用程序处理,临时表性能更好,更方便

代码如下复制代码 with area as( select *,id px,cast(id as nvarchar(4000)) px2 from region where parentid=0 union all select a.*,b.px,b.px2+ltrim(a.region_id) from region a join area b on a.parentid=b.id )select * from area order by px,px2

可以查询出结果-所有分类及相应分类下子分类

代码如下复制代码 id title parentid 1 广东省 0 2 广州 1 3 白云区 2 4 深圳 1 5 湖南省 0 6 长沙 5 7 株洲 5 代码如下复制代码

with area as( select * from region where parentid=1 union all select a.* from region a join area b on a.parentid=b.id )select * from area

可以查询出结果-指定分类及相应分类下子分类 id title parentid 1 广东省 0 2 广州 1 3 白云区 2

实现程序

代码如下复制代码

/*标题:查询指定节点及其所有子节点的函数作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-05-12地点:广东深圳*/

create table tb(id varchar(3) , pid varchar(3) , name varchar(10))insert into tb values('001' , null , '广东省')insert into tb values('002' , '001' , '广州市')insert into tb values('003' , '001' , '深圳市')insert into tb values('004' , '002' , '天河区')insert into tb values('005' , '003' , '罗湖区')insert into tb values('006' , '003' , '福田区')insert into tb values('007' , '003' , '宝安区')insert into tb values('008' , '007' , '西乡镇')insert into tb values('009' , '007' , '龙华镇')insert into tb values('010' , '007' , '松岗镇')go

--查询指定节点及其所有子节点的函数create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int)asbegin declare @level int set @level = 1 insert into @t_level select @id , @level while @@ROWCOUNT 0 begin set @level = @level + 1 insert into @t_level select a.id , @level from tb a , @t_Level b where a.pid = b.id and b.level = @level - 1 end returnendgo

本文由网上澳门金莎娱乐发布于数据库,转载请注明出处:sql多级分类汇总实现介绍

关键词: