0

column を含む db テーブルがありますdisplay_order。データは次のようになります。

2 
4 
7 
10 
12

同じ db 列を更新したいのですが、次のようになります。

1
2
3
4
5

簡単な SQL コードを提案してください。

4

3 に答える 3

4

ROW_NUMBER()を調べてください。これはここで役立ちます。

たとえば、データは更新されませんが、ROW_NUMBER に基づいて現在の順序と新しい順序が表示されるデモ

SELECT display_order AS CurrentDisplayOrder, 
    ROW_NUMBER() OVER (ORDER BY display_order) AS NewDisplayOrder
FROM YourTable
ORDER BY display_order

期待どおりの結果が得られた場合は、それを UPDATE ステートメントに切り替えることができます。

于 2012-04-04T14:17:15.367 に答える
0

AdaTheDev のアイデアを拡張する - CTE (Common Table Expression) を使用すると、actual を使用しUPDATEてテーブルを更新する方法を非常に簡単に確認できます。ここでは、テーブル変数を使用し@workて既存のテーブルをシミュレートしています。テーブル変数を独自のテーブル名に置き換えるだけです。

DECLARE @work TABLE (display_order INT)

INSERT INTO @work VALUES(2)
INSERT INTO @work VALUES(4)
INSERT INTO @work VALUES(7)
INSERT INTO @work VALUES(10)
INSERT INTO @work VALUES(12)

SELECT * FROM @work

;WITH UpdateTable AS
(
    SELECT 
        display_order, new_order = ROW_NUMBER() OVER (ORDER BY display_order) 
    FROM @work
)
UPDATE @work
SET display_order = u.new_order
FROM @work w 
INNER JOIN UpdateTable u ON w.display_order = u.display_order

SELECT * FROM @work
于 2012-04-04T14:20:55.220 に答える
0

CTE なし (ただし、テーブルにいくつかのキーが必要)

declare @tbl table(id int primary key identity(1,1),Value int)
insert @tbl values(2)
insert @tbl values(5)
insert @tbl values(3)

select * from @tbl 

select *, ROW_NUMBER() over(order by Value) from @tbl order by id

update @tbl set Value = result from @tbl tbl 
inner join (select id, ROW_NUMBER() over(order by Value) result from @tbl ) hlp    on tbl.id =hlp.ids

select * from @tbl 
于 2012-04-04T14:30:34.763 に答える