白送101分,只求一个简单的SQL语句!!!(101分)

  • 主题发起人 主题发起人 studydelphi77
  • 开始时间 开始时间
S

studydelphi77

Unregistered / Unconfirmed
GUEST, unregistred user!
D7里ADO连一个ACCESS,假设只有一张表,表里只有一个字段记做“A”
A
1
2
4
3
2
要求生成一个新表,内容如下
A B
1 2
2 4
4 3
3 2
2 2
也就是添加一个新字段“B”,其第一个记录是“A”的第二个记录,第二个记录是“A”的第三个记录...倒数第二个记录是“A”的倒数第一个记录,倒数第一个记录也是“A”的倒数第一个记录
 
很简单,做一个select * from A ,再一个循环,读第一条时,暂存变量中,第二条时insert to B,循环结束后,insert 第一条从变量中取。
 
KK168,我不大明白你的意思。我想最好能用SQL解决不在delphi中写循环,实际中这张表有超过10个字段都要做这个处理,而且这样的表不止一张。最头疼的是例子中的记录只是一组用时间和一个ID区分的记录,同一张表里还有很多不同ID的记录(ID是重复的),比如下面,我想这个循环能写出来也太复杂了吧。
ID A TIME
1 1 TIME5
1 2 TIME4
1 4 TIME3
1 3 TIME2
1 2 TIME1
2 8 TIME6
2 7 TIME2
2 9 TIME1
 
问题不变 ,继续等待 ,
 
增加一个字段,用作标识,自增1
假设表名为t2,该字段为A,新增字段ID1 int IDENTITY (1, 1) NOT NULL

下面的语句可以达到你要的结果.很简单,相信不用再解释了
select l.A , case when r.A is NULL then l.A else r.A end as B from t2 l inner join
(
select distinct l.ID1 as lID, min(r.ID1) as rID from t2 l left join
t2 r on l.ID1<r.ID1
group by l.ID1
)m on l.ID1=m.lID
left join t2 r on r.ID1=m.rID
 
什么呀,表真烂,先说你按什么排序吧,我假设你是按Index排序的,Index为主键,你换成你现实须要的排序.(如果你没有主键,那我也就不会了)
除了最后一条记录
其它的可以这样写
Update 表 aa set B = (Select Top 1 A From 表 as 表2 Where Index>aa.Index order By Index)
最后一条另外处理
Update 表 Set B=A From (Select top 1 * from 表 Order By Index desc) c Where 表.Index=c.Index

如果只是按你题目中的 "假设只有一张表,表里只有一个字段记做“A”"这样的条件的话
我没办法.
我只是讨论一下,我的答案可能不符合你要求3

如果是程序做的话,可以按你的排序须求先生成一个自增的字段,然后用这个字段做.
说句:SQL编程带来SQL语句难写问题的90%是因为数据库结构不合理导致的.....
这个表连主键都没有,就更别说什么范式了.
 
有自增自段还可以这样写
Update 表 Set B=表2.A From 表 as 表2
Where 表.Index=表2.Index-1
最后一条记录
Update 表 Set B=A Where B Is Null
 
TO 影子,你的方法我没有看懂,CASE WHEN是不是不能用于ACCESS库,连接表的关系不懂,不知道M和R是哪个的别名。不过到是考虑了不同GROUP BY ID了,但是“<”用的有问题。
TO 晚起的小虫,用ORDER BY + TOP不能区分不同的ID,这也是我不想加个自增字段的原因。
TO ALL,如果加入自增字段我已经写好一个SQL,比较复杂,字段多了很麻烦,我就想要一个简单的SQL可以在不增加字段的情况下解决一楼的问题,相信强大的SQL不会连这么个小的逻辑关系都表达不出来。
再等三天如果还没有解决就结束问题,上面的大侠会适当的加分。谢谢
 
请楼主同学为你以后所设计的表建一个唯一关键字,建一个用于排序的字段
这样才能比较方便的超作数据库
在项目中,我的经验是使用一个ID字段,这个字段是关键字,而且后生成的ID一定要比前面的大,至于用什么规则来赋值,你可以写在触发器里面,也可以写在程序里面,最后这个字段与业务数据无关,唯一的作用是“关键字”
 
多人接受答案了。
 
后退
顶部