我有这张桌子:
SELECT * FROM items
id | item | position
---|-----------|----------
1 | USB cable | 0
2 | SD card | 4
3 | Mouse | 2
4 | Keyboard | 0
5 | Monitor | 3
Run Code Online (Sandbox Code Playgroud)
对该表进行排序会得到以下结果:
SELECT * FROM items ORDER BY position
id | item | position
---|-----------|----------
4 | Keyboard | 0
1 | USB cable | 0
3 | Mouse | 2
5 | Monitor | 3
2 | SD card | 4
Run Code Online (Sandbox Code Playgroud)
现在我想更新表格并将订单保存在位置列中:
SELECT * FROM items
id | item | position
---|-----------|----------
4 | Keyboard | 1
1 | USB cable | 2
3 | Mouse | 3
5 | Monitor | 4
2 | SD card | 5
Run Code Online (Sandbox Code Playgroud)
这可以通过单个查询完成还是我必须手动遍历所有行并进行手动更新?
如果顺序没有完全定义(例如,对于上面的 USB 电缆和键盘),我只是随意决定了顺序。
gbn*_*gbn 12
UPDATE
T1
SET
position = T2.rn
FROM
myTable T1
JOIN
(
SELECT
id,
ROW_NUMBER() OVER (ORDER BY position) AS rn
FROM
myTable
) T2 ON T1.id = T2.id
Run Code Online (Sandbox Code Playgroud)
注意:“键盘”和“USB 线”的顺序是任意的。他们都有位置 = 0
要根据项目平局位置,请添加辅助排序
ROW_NUMBER() OVER (ORDER BY position, item) AS rn
Run Code Online (Sandbox Code Playgroud)
如果您有重复的位置,项目对,这也将是任意的...