UPDATE…FROM带有子查询的语法

时间:2019-05-05 22:00:07

标签: sql sqlite

我有一个表items,其中有一个priority列,它只是一个整数。在尝试执行一些批量操作时,我试图将priority重置为连续数字。

我已经能够使用ROW_NUMBER()成功地生成具有我想要的新priority值的表。现在,我只需要将来自该SELECT查询的值放入实际items表中的匹配记录中即可。

我尝试过这样的事情:

UPDATE
  "items"
SET
  "priority" = tempTable.newPriority
FROM
  (
    SELECT
      ROW_NUMBER() OVER (
        ORDER BY
          /* pile of sort conditions here */
      ) AS "newPriority"
    FROM
      "items"
  ) AS tempTable
WHERE
  "items"."id" = "tempTable"."id"
;

我不断收到“靠近FROM”的语法错误。

如何在此处更正语法?

2 个答案:

答案 0 :(得分:1)

SQLite 不如其他rdbms灵活,它甚至不支持update语句中的联接。
相反,您可以执行以下操作:

update items
set priority = 1 + (
  select count(*) 
  from items i 
  where i.id < items.id
)

这样,条件仅由id派生。
因此,priority列将填充序号1, 2, 3, ....
如果您可以通过这种方式应用堆排序条件,则可以进行更新。
编辑
尽管我不确定它的效率,但是像这样的事情也许可以满足您的需求:

UPDATE items
SET priority = (
  SELECT newPriority FROM (
    SELECT id, ROW_NUMBER() OVER (ORDER BY /* pile of sort conditions here */) AS newPriority
    FROM items
  ) AS tempTable
  WHERE tempTable.id = items.id
)

答案 1 :(得分:0)

事实证明,此特定问题的根本答案是SQLite不支持UPDATE ... FROM。因此,需要一些替代方法。

https://www.sqlite.org/lang_update.html