请sql高手来看看这个经典的1+2+...+100的问题!这是我自己想到的。

我自己已经解决了,但估计高手们还有更好的解法。现在我有sqlserver2008表如下
CREATE TABLE [dbo].[tCursor](
[ID] [int] NOT NULL,
[Sum] [int] NULL
) ON [PRIMARY]
然后用循环添加id,1-100,
declare @i int
set @i=1
while(@i <=100)
begin
insert into tCursor (ID) values(@i)
set @i=@i+1
end
然后,要达到的结果如下,

也就是某行的sum是某行以及之前所有id之和。求高手给出具体的sql代码,请测试后再发答案!
---------------
还有,解法必须有一定灵活性,主要体现在不能假设id列是具体的某些数字,他们只是任意的自然数。我上面写了1-100只是因为方便看结果是否正确。

select ID, (select sum(ID) from tCursor b where b.ID<=a.ID) from tCursor a追问

你那个小于号是无法正确得到前面的行的吧,我上面说了不能假设已有id的大小或顺序。他们是随机自然数。

你那个小于号是无法正确得到前面的行的吧,我上面说了不能假设已有id的大小或顺序。他们是随机自然数。

追答

既然你对ID列有“随机自然数”的要求,那ID就不能作为自增长的主键,记录的顺序就毫无意义。

想有顺序,就得另建一个自增的列作为主键(假设为PID),并将ID的值累加到SUM中,SQL语句如下:

select PID, ID,(select sum(ID)  from tCursor b where b.PID<=a.PID) as SUM from tCursor a


结果:

追问

你说的顺序无意义我只能同意一半,因为sqlserver就是按照插入的顺序来显示的,你有什么办法让那顺序混乱呢?
你上面只是一个select语句,没有update?
还有你那明明是excel,没测试过啊?

追答

不能以你直接在数据库中看到的顺序为准。不同的数据库,对于不加order by的select的排序逻辑不同,尤其是表发生过删除、插入的情况下,默认排序经常会看起来是混乱的。所以最终你一定要按某种确定的order by的顺序在应用界面上呈现给用户,这是好的编程习惯,有利于程序跨数据库迁移。


上面的图片和语句,是在ACCESS中测试的,因为我电脑上没有sqlserver。


你可以看看附件中的原数据库文件。原表中只有PID和ID。查询结果中的SUM字段,是在查询过程中生成的。



追问

但我提问明确了是sqlserver,你有什么办法让那顺序混乱呢?只能说还是谢谢你了。如果没有更好的答案就采纳你吧。

追答

即便是在sqlserver中,这种没主键没索引的表,不加order by,是保证不了select的顺序的。现在就这几条记录,看似有序。等用上一段时间之后,数据一多,你就不知道优化器会怎么干活了。

给你看一篇旧文,说得比较清楚:
http://www.cftea.com/c/2009/04/YZNSRK1DWLTRR8GE.asp

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-23
是已经生成ID列,要求填入Sum列;还是一张空表,要求同时填入ID 列和Sum列?追问

已经有id,填sum。

追答

一条语句即可:
UPDATE [tCursor] SET Sum=(SELECT SUM(ID) FROM [tCursor] A WHERE ID<=[tCursor].ID)

追问

不能假设数字是升序插入的,是随机的。

追答

这个语句数字随机的也可以,结果是正确的。


相似回答