求SQL语句解决方案,在线等...

hbzyduwu 2005-06-09 02:56:21

举个例子说吧。 比如有下表:
Column1 Column2 Column3
20050607000603 11 AAA
20050606235350 22 BBB
20050606235340 33 CCC
20050606234145 44 DDD
20050606233752 55 EEE

1.用SQL语句直接实现:
如何把任意列的值,向下移动,就象用SQL语句update后的效果,即就成这样:
20050607000603 11 EEE (这里的值可以随意,或者用EEE)
20050606235350 22 AAA
20050606235340 33 BBB
20050606234145 44 CCC
20050606233752 55 DDD

任意列都可以这样改变,比如Column2我也可往上,或往下移动。就象记录集指针移动过一样


2.用SQL语句直接实现:
可以随机删除指定行数据,要有规律,比如,每三条里数据里,删除1-3之间的任意一条,比如,删除3,即:

1 aaa
2 bbb
3 ccc

4 ddd
5 eee
6 fff

删除后:
1 aaa

3 ccc

4 ddd
5 eee
记录2,和记录6是,区间1-3的倍数内随机删除的
...全文
191 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
star0796 2005-06-11
  • 打赏
  • 举报
回复
我没说SQL Server 里有goto语句
我说的是个想法
只是算法
dh20156 2005-06-10
  • 打赏
  • 举报
回复
MARK下先
hbzyduwu 2005-06-10
  • 打赏
  • 举报
回复
问题1是靠时间排序的, 也可以加上一个递增的ID字段来排序.
baikaishui_0825 2005-06-10
  • 打赏
  • 举报
回复
问题1靠什么排序的?
fengfangfang 2005-06-09
  • 打赏
  • 举报
回复
1.用游标了

2.也可以用游标
就是数据多了有点慢
baikaishui_0825 2005-06-09
  • 打赏
  • 举报
回复
问题2:
--测试数据
create table test(id int IDENTITY(1,1),a varchar(10))
insert test
select 'aaa'
union all
select 'bbb'
union all
select 'ccc'
union all
select 'ddd'
union all
select 'eee'
union all
select 'fff'


declare @r float
declare @rr int
declare @total int
declare @sql Nvarchar(100)
select @total=count(*) from test
set @r=rand()

if @r<0.33 select @rr=1
if @r>0.66 select @rr=3
if @r>0.33 and @r<0.66 select @rr=2
while @total>=@rr
begin
set @sql='delete from test where id='+cast(@rr as nvarchar)
exec sp_executesql @sql
set @rr=@rr*3

end
select * from test
--删除测试数据
drop table test


结果:
1 aaa
3 ccc
4 ddd
5 eee
hbzyduwu 2005-06-09
  • 打赏
  • 举报
回复
这个想法应该是可以的.

需要用过程来写吗? 还是直接在查询分析器里执行?
你能不能把上面的想法进一步变成sql语句, 我对goto,rand() 这些sql语句太陌生了,
star0796 2005-06-09
  • 打赏
  • 举报
回复
至于第二个问题你可以这么思考

1: 给记录一个identity类型字段 id 让其自动加一
2: 1->i ; 当i<给定值
3: 随机产生一个1-3的随机数 r ;
4: delid = r + 3*i ;
5: delete table1 where id = delid ;
6: goto 2

以上是我的想法你可以试试!!
star0796 2005-06-09
  • 打赏
  • 举报
回复
你可以先将其中一列提取出来,然后添加一个记录,最后再合并就行了
1:先提取要修改的列
select Column3 into temp ;
2:删除原来表中列
drop table1(Column3) ;
3:在临时表中添加一个记录
insert into temp value ('EEE') ;
4:最后合并temp表和原来的表
xingljx 2005-06-09
  • 打赏
  • 举报
回复
你说的需求不是太清楚,我建议重新构造你的表结构,然后通过标间的主键关联这三列,这样根据需求就可以获得不同的结果了
hbzyduwu 2005-06-09
  • 打赏
  • 举报
回复
where id between 1 and 3

不行, 因为 这里的1和3是一个变量, 比如表里有9条数据,我需要删除的区间分别是

1---3 里的任意一条
4---6 里的任意一条
7---9 里的任意一条
hbzyduwu 2005-06-09
  • 打赏
  • 举报
回复
我要的不是取出的顺序
是想让表的某个整列的值, 从某处往上或往下移动.

比如:

a 111
b 222
c 333

(向上)操作后:
a 222
b 333
c 111 //这一条可以删除掉


(向下)操作后:
a //这一条可以删除掉
b 222
c 333
gatey 2005-06-09
  • 打赏
  • 举报
回复
可以再建一个表
id Column3
1 AAA
2 BBB
3 CCC

上面的表改为
Column1 Column2 Column3id
20050607000603 11 1
20050606235350 22 2
20050606235340 33 3
20050606234145 44 4
20050606233752 55 5


这样就可以用排列的方法来做了

iuhxq 2005-06-09
  • 打赏
  • 举报
回复
1、记录存储本身是没有顺序的
你要得也许是取出的顺序
可以用order by 来实现

2、删除区间的数据用between实现

例:where id between 1 and 3
hbzyduwu 2005-06-09
  • 打赏
  • 举报
回复
高手帮帮忙QQ:66572030

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧