column を含む db テーブルがありますdisplay_order
。データは次のようになります。
2
4
7
10
12
同じ db 列を更新したいのですが、次のようになります。
1
2
3
4
5
簡単な SQL コードを提案してください。
column を含む db テーブルがありますdisplay_order
。データは次のようになります。
2
4
7
10
12
同じ db 列を更新したいのですが、次のようになります。
1
2
3
4
5
簡単な SQL コードを提案してください。
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 ステートメントに切り替えることができます。
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
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