如果我在MSSQL中的表中有这些数据,它表示一个水平的对象行及其坐标:
row id value
35395 776130 0
35395 776131 20
35395 776132 40
35395 776133 60
35395 776134 80
35395 776135 100
35395 776136 120
35395 776137 140
35395 776138 160
35395 776139 180
35395 776140 200
我想更改值,以便按降序排序(将行翻转180度):
row id value
35395 776130 200
35395 776131 180
35395 776132 160
35395 776133 140
35395 776134 120
35395 776135 100
35395 776136 80
35395 776137 60
35395 776138 40
35395 776139 20
35395 776140 0
如何使用更新语句逐个执行此操作?
答案 0 :(得分:2)
我不知道问题的性质,但只根据你的例子,你不能更新所有行吗
UPDATE `thetable` SET value = 200 - value
同样,我不知道问题的本质,所以它可能不是那么容易,但是再次这似乎适用于您的简化示例,并且可能适用于您的现实世界问题。
答案 1 :(得分:0)
在Seb's answer的帮助下,我制定了一个解决方案:
declare @maxcoord int;
declare @rowid int; set @rowid = 35395
select @maxcoord = max(value) from table where row = @rowid
update table set value = @maxcoord - value
where row = @rowid
我想我会为此创建一个存储过程,因为我认为这不会是唯一一次使用它:)
答案 2 :(得分:0)
如果您使用的是SQL Server 2005或更高版本,则可能会为您执行此操作。优点是它只是一个查询。
with T1(rn,row,id,value) as (
select
rank() over (
order by value,row,id
),
row,id,value
from T
), T2(rn,value) as (
select
row_number() over (
order by value desc
), value
from T
), T12(row,id,value,vnew) as (
select row,id,T1.value,T2.value
from T1 join T2 on T1.rn = T2.rn
)
update T12 set
value = vnew;
我假设“value”列最初在增加,你希望它减少,但我允许两个连续值相同的可能性,只要(row,id)是表的一个键。 / p>
还有其他可能性。例如,如果(row,id)是一个键,并且您想要将“value”值的顺序从它们所处的位置反转到“镜像”位置,则可以执行以下操作:
with T1(rn,row,id,value) as (
select
rank() over (
order by row,id
),
row,id,value
from T
), T2(rn,value) as (
select
rank() over (
order by row desc,id desc
), value
from T
), T12(row,id,value,vnew) as (
select row,id,T1.value,T2.value
from T1 join T2 on T1.rn = T2.rn
)
update T12 set
value = vnew;
使用正确的索引,这可能相对有效。
答案 3 :(得分:0)
您想要实际更新行,还是只想以相反的顺序显示它们?如果它只是显示顺序,请尝试:
SELECT row, id, 200-value as Value
FROM YourTable
ORDER BY (200-value) DESC