是否可以仅使用一个 UPDATE 语句显式保存来自 ORDER BY 语句的排序?

Dan*_*ski 4 order-by update

我有这张桌子:

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)

如果您有重复的位置,项目对,这也将是任意的...