处理这个问题有没有简单方法

飞起来一脚 2009-08-24 04:05:31
数据库a,两个字段,x,y表示坐标列,行
x y
------
1 2
1 3
1 1
2 3
2 2
1 4
....

我要删除其中的一条记录以后
根据删除的列号x同一列的所有比y大的数据都一次向上减小1,如上表删除第一个数据1,2,则表变为
x y
------

1 2---3-1=2
1 1
2 3
2 2
1 3---4-1=3
....

并且这种操作会同时多次删除多条记录,采用删除一条,就更新上述操作一次好呢,还是全部删除完毕以后集体更新一次好?
有没有更好的处理思路,总觉得一条一条该,使用无数次update显得比较笨重。
...全文
75 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞起来一脚 2009-08-24
  • 打赏
  • 举报
回复
output在sql2000中是不是不能用?
  • 打赏
  • 举报
回复

--一次删除一行。
declare @i int

select @i=y from a where (删除的条件如x=1 and y=2)

delete from a where (删除的条件如x=1 and y=2)

update a set a.y=a.y-1 where y>@i
飞起来一脚 2009-08-24
  • 打赏
  • 举报
回复
知道肯定是对的,不过看不懂,先给了分,然后慢慢学习!!!
liangCK 2009-08-24
  • 打赏
  • 举报
回复
-------------------------------------------
-- Author : liangCK 小梁
-- Comment: 小梁 爱 兰儿
-- Date : 2009-08-24 16:13:45
-------------------------------------------

--> 生成测试数据: [T]
IF OBJECT_ID('[T]') IS NOT NULL DROP TABLE [T]
CREATE TABLE [T] (x INT,y INT)
INSERT INTO [T]
SELECT 1,2 UNION ALL
SELECT 1,3 UNION ALL
SELECT 1,1 UNION ALL
SELECT 2,3 UNION ALL
SELECT 2,2 UNION ALL
SELECT 1,4

--SQL查询如下:

GO

CREATE TRIGGER tri_test ON T
FOR DELETE
AS
UPDATE T SET
y = T.y - 1
FROM T JOIN deleted AS B
ON T.x = B.x AND T.y > B.y;
GO

DELETE T WHERE x = 1 AND y = 2;

SELECT * FROM T;

GO
DROP TABLE T

/*
x y
----------- -----------
1 2
1 1
2 3
2 2
1 3

(5 row(s) affected)
*/
guguda2008 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liangck 的回复:]
SQL code-------------------------------------------
-- Author : liangCK 小梁
-- Comment: 小梁 爱 兰儿
-- Date : 2009-08-24 16:10:26
---------------------------------------------> 生成测试数据: @TDECLARE@TTABLE (xINT,yINT)INSERTINTO@TSELECT1,2UNIONALLSELECT1,3UNIONALLSELECT1,1UNIONALLSELECT2,3UNIONALLSELECT2,2UNIONALLSELECT1,4--SQL查询如下:DECLARE@tmpTABLE(xint,yint);DELETE@T OUTPUT deleted.x,deleted.yINTO@tmpWHERE x=1AND y=2;UPDATE ASET
y= A.y-1FROM@TAS AJOIN@tmpAS BON A.x= B.xAND A.y> B.y;SELECT*FROM@T;/*
x y
----------- -----------
1 2
1 1
2 3
2 2
1 3

(5 row(s) affected)*/
[/Quote]
学习
黄_瓜 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liangck 的回复:]
SQL code-------------------------------------------
-- Author : liangCK 小梁
-- Comment: 小梁 爱 兰儿
-- Date : 2009-08-24 16:10:26
---------------------------------------------> 生成测试数据: @TDECLARE@TTABL¡­
[/Quote]
up
liangCK 2009-08-24
  • 打赏
  • 举报
回复
-------------------------------------------
-- Author : liangCK 小梁
-- Comment: 小梁 爱 兰儿
-- Date : 2009-08-24 16:10:26
-------------------------------------------

--> 生成测试数据: @T
DECLARE @T TABLE (x INT,y INT)
INSERT INTO @T
SELECT 1,2 UNION ALL
SELECT 1,3 UNION ALL
SELECT 1,1 UNION ALL
SELECT 2,3 UNION ALL
SELECT 2,2 UNION ALL
SELECT 1,4

--SQL查询如下:

DECLARE @tmp TABLE(x int,y int);

DELETE @T OUTPUT deleted.x,deleted.y INTO @tmp WHERE x = 1 AND y = 2;

UPDATE A SET
y = A.y - 1
FROM @T AS A
JOIN @tmp AS B
ON A.x = B.x AND A.y > B.y;


SELECT * FROM @T;

/*
x y
----------- -----------
1 2
1 1
2 3
2 2
1 3

(5 row(s) affected)
*/
feixianxxx 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beirut 的回复:]
引用 1 楼 guguda2008 的回复:
我对LZ的头像有印象

你见到美女都要嫁个你,见个美女头像都说有印象
[/Quote]

黄_瓜 2009-08-24
  • 打赏
  • 举报
回复
触发器
黄_瓜 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 guguda2008 的回复:]
我对LZ的头像有印象
[/Quote]
你见到美女都要嫁个你,见个美女头像都说有印象
guguda2008 2009-08-24
  • 打赏
  • 举报
回复
用触发器实现比较好吧
  • 打赏
  • 举报
回复
删除一条,就更新上述操作一次
guguda2008 2009-08-24
  • 打赏
  • 举报
回复
我对LZ的头像有印象

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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