用SQL语句生成新列--排序列(1,2,3,4,5,6,。。)
解决了40分。现在不给。不然没人答上浪费了。首先这是SQLserver2000,不是2005。我要的是一列新的列,是排序之后自动生成的一列新列。如果用于排序的列只有一列“...
解决了40分。现在不给。不然没人答上浪费了。
首先这是SQLserver2000,不是2005。我要的是一列新的列,是排序之后自动生成的一列新列。
如果用于排序的列只有一列“vv”,那这样写:
select no=(select count(vv) from aaa t where t.vv<=o.vv ),*
from aaa o
order by vv
这样生成了no。
问题来了,如果用于排序的列是两列、三列呢?怎么写?
vv是用于排序的列,如果用于排序的列有三列呢?
按三列排完后再生成no,我要的新列 展开
首先这是SQLserver2000,不是2005。我要的是一列新的列,是排序之后自动生成的一列新列。
如果用于排序的列只有一列“vv”,那这样写:
select no=(select count(vv) from aaa t where t.vv<=o.vv ),*
from aaa o
order by vv
这样生成了no。
问题来了,如果用于排序的列是两列、三列呢?怎么写?
vv是用于排序的列,如果用于排序的列有三列呢?
按三列排完后再生成no,我要的新列 展开
3个回答
展开全部
顺着你的思路说:现在是按VV1,VV2,VV3,VV4,VV5排序(适用于任意类型的字段):
select no=
(select count(1) from aaa t where
t.vv1<o.vv1 or --一个字段排序到此为止,但把<换成<=
t.vv1=o.vv1 and t.vv2<o.vv2 or--两个到此为止,但把最后的<换成<=
t.vv1=o.vv1 and t.vv2=o.vv2 and t.vv3<o.vv3 or--三个、四个以此类推
t.vv1=o.vv1 and t.vv2=o.vv2 and t.vv3=o.vv3 and t.vv4<o.vv4 or
t.vv1=o.vv1 and t.vv2=o.vv2 and t.vv3=o.vv3 and t.vv4=o.vv4 and t.vv5<=o.vv5
),*
from aaa o
order by vv1,vv2,vv3,vv4,vv5
------------------------------
看出来了吧?有多少个变量排序,就写多少层,书写起来麻烦,但查询起来,一个和多个速度基本是一样的,没有多大差别。
按照规律书写也并不麻烦,
规律总结一下,就是,
一层层复制,稍作修改。每层长出一组
每层最后一个符号是小于号(<),其余都是等号。
所有层的最后一个符号是小于等于(<=)。
如果按排序字段(本例为VV1,VV2,VV3,VV4,VV5)进行了索引,查询速度会大大加快。
select no=
(select count(1) from aaa t where
t.vv1<o.vv1 or --一个字段排序到此为止,但把<换成<=
t.vv1=o.vv1 and t.vv2<o.vv2 or--两个到此为止,但把最后的<换成<=
t.vv1=o.vv1 and t.vv2=o.vv2 and t.vv3<o.vv3 or--三个、四个以此类推
t.vv1=o.vv1 and t.vv2=o.vv2 and t.vv3=o.vv3 and t.vv4<o.vv4 or
t.vv1=o.vv1 and t.vv2=o.vv2 and t.vv3=o.vv3 and t.vv4=o.vv4 and t.vv5<=o.vv5
),*
from aaa o
order by vv1,vv2,vv3,vv4,vv5
------------------------------
看出来了吧?有多少个变量排序,就写多少层,书写起来麻烦,但查询起来,一个和多个速度基本是一样的,没有多大差别。
按照规律书写也并不麻烦,
规律总结一下,就是,
一层层复制,稍作修改。每层长出一组
每层最后一个符号是小于号(<),其余都是等号。
所有层的最后一个符号是小于等于(<=)。
如果按排序字段(本例为VV1,VV2,VV3,VV4,VV5)进行了索引,查询速度会大大加快。
展开全部
如何在SQL中对行进行动态编号,加行号这个问题,在数据库查询中,是经典的问题。
方法整理如下:
代码基于pubs样板数据库
在SQL中,一般就这两种方法.
1.使用临时表
可以使用select into 创建临时表,在第一列,加入Identify(int,1,1)作为行号,
这样在产生的临时表中,结果集就有了行号.也是目前效率最高的方法.
这种方法不能用于视图
代码:
set nocount on
select IDentify(int,1,1) 'RowOrder',au_lname,au_fname into #tmp from authors
select * frm #tmp
drop table #tmp
2.使用自连接
不用临时表,在SQL语句中,动态的进行排序.这种方法用到的连接是自连接,连接关系一般是
大于,
代码:
select rank=count(*), a1.au_lname, a1.au_fname
from authors a1 inner join authors a2 on a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
group by a1.au_lname, a1.au_fname
order by count(*)
运行结果:
rank au_lname au_fname
----------- ---------------------------------------- --------------------
1 Bennet Abraham
2 Blotchet-Halls Reginald
3 Carson Cheryl
4 DeFrance Michel
5 del Castillo Innes
6 Dull Ann
7 Greene Morningstar
... ....
缺点:
1.使用自联接,所以该方法不适用于处理大量行。它适用于处理几百行。
对于大型表,一定要使用索引以避免进行大范围的搜索,或用第一种方法.
2.不能正常处理重复值。当比较重复值时,会出现不连续的行编号。
如果不希望出现这种现象,可以在电子表格中插入结果时隐藏排序列,而是使用电子表格编号。
或用第一种方法
优点:
这些查询可以用于视图和结果格式设置中
方法整理如下:
代码基于pubs样板数据库
在SQL中,一般就这两种方法.
1.使用临时表
可以使用select into 创建临时表,在第一列,加入Identify(int,1,1)作为行号,
这样在产生的临时表中,结果集就有了行号.也是目前效率最高的方法.
这种方法不能用于视图
代码:
set nocount on
select IDentify(int,1,1) 'RowOrder',au_lname,au_fname into #tmp from authors
select * frm #tmp
drop table #tmp
2.使用自连接
不用临时表,在SQL语句中,动态的进行排序.这种方法用到的连接是自连接,连接关系一般是
大于,
代码:
select rank=count(*), a1.au_lname, a1.au_fname
from authors a1 inner join authors a2 on a1.au_lname + a1.au_fname >= a2.au_lname + a2.au_fname
group by a1.au_lname, a1.au_fname
order by count(*)
运行结果:
rank au_lname au_fname
----------- ---------------------------------------- --------------------
1 Bennet Abraham
2 Blotchet-Halls Reginald
3 Carson Cheryl
4 DeFrance Michel
5 del Castillo Innes
6 Dull Ann
7 Greene Morningstar
... ....
缺点:
1.使用自联接,所以该方法不适用于处理大量行。它适用于处理几百行。
对于大型表,一定要使用索引以避免进行大范围的搜索,或用第一种方法.
2.不能正常处理重复值。当比较重复值时,会出现不连续的行编号。
如果不希望出现这种现象,可以在电子表格中插入结果时隐藏排序列,而是使用电子表格编号。
或用第一种方法
优点:
这些查询可以用于视图和结果格式设置中
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先你的语句是给记录编号用的
咋可能有两列三列的呢
HI 我细聊吧
咋可能有两列三列的呢
HI 我细聊吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询