2009-09-20 130 views
2

如果非要在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 

而且我想改變價值觀,讓他們按降序排列爲了(翻轉行180degrees):

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 

我怎樣才能做到這一點使用update語句沒有做這一個接一個?

回答

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 

我想我會創建一個存儲過程爲這個,因爲我不認爲這將是將要使用的唯一的一次:)

+0

數據修復程序是有一點是;我對這背後的業務邏輯感到好奇,因爲數據模型看起來並不合適。 – 2009-09-20 04:28:54

+0

其數據修復。 – 2009-09-20 11:43:24

2

我不知道這個問題的本質,而只是根據你的榜樣,你能不能更新所有行做

UPDATE `thetable` SET value = 200 - value 

再說一遍,我不知道這個問題的性質,以便它可能不是那麼容易,但是這又似乎在你簡化的例子中起作用,並且還可能在你現實世界的問題中起作用。

+0

感謝。我想我可以嘗試制定出最大的座標值,並用它代替你的200值。這可能是解決方案 – 2009-09-20 00:31:45

+0

對於每一行我的意思。例如我所提供的行 - 最大值爲200 – 2009-09-20 00:32:27

+1

這當然答案是假設值被均勻地間隔開 – MartW 2009-09-20 00:34:50

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; 

我認爲「價值」一欄原本正在增加,你希望它下降,但我不允許連續兩個值是相同的,只要(行ID)的可能性是關鍵桌子。

還有其他的可能性。例如,如果(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; 

有了正確的指標,這可能是比較有效的。

+0

這看起來很混亂。 – 2009-09-23 00:58:23

0

是否要實際更新的行,或者你只是想以相反的順序來顯示它們?如果只是爲了顯示,試試這個:

SELECT row, id, 200-value as Value 
    FROM YourTable 
ORDER BY (200-value) DESC