给查询增加一个序列

很多时候我们对查询的结果要增加一个序列,通常有用临时表和用自连接两种途径来实现。
 
用临时表:
select 序号= identity(int,1,1),* into #tmp from @t select * from #tmp ;
drop table #tmp
 
不用临时表:
select 序号=(select sum(1) from @t where and  id<=a.id),*    
from @t a order by  a.id 
 
稍稍复杂一点,假设表里面要根据不同的类型来加序列,可以这样:
select 序号=(select sum(1) from @t where type=a.type and  id<=a.id),*    
from @t a order by  a.id 
 
 
继续扩展一下。
select 序号=(select sum(1) from @t where type=a.type and id<=a.id),*
from @t a order by a.id
这个代码有一个情况:当最小id的两者id相同时(这里id假设不是主键,可以看作是成绩之类的),两个的序号都会变成2,或者说是并列第二。
我们通常喜欢将这种情况归为并列第一。这样我们可以将这个代码稍作修改。

注意把比较的<=改成<之后,两个同样最小的id因为没有比它再小的id了所以sum(1)会变成null,所以这里要加个小小的处理。
再对上面的情况加一点点扩展。
如果我的比较方法是先比较id,如果id相同再比较另外一个字段来排序,那应该怎么修改上面的代码呢?
答案:
select 序号=(select isnull(sum(1)+1,1) from @t where type=a.type and (id<a.id or field<a.field) ),*
from @t a order by a.id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值