【问题标题】:UPDATE … FROM syntax with sub-queryUPDATE ... FROM 带有子查询的语法
【发布时间】:2019-05-06 12:30:39
【问题描述】:

我有一个表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”的语法错误。

我怎样才能更正这里的语法?

【问题讨论】:

  • 这在 SQLite 中很难做到。

标签: sql sqlite


【解决方案1】:

SQLite 不如其他 rdbms 灵活,它甚至不支持 update 语句中的连接。
你可以做的是这样的:

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

这样,条件只能由ids 派生。
因此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
)

【讨论】:

  • 嗯...我之前尝试过这种方法,但结果是所有priority 值都等于相同的值。我会再摆弄它,看看我是否可以让它合作。感谢您的反馈!
  • 再次感谢您的帮助。我已经发布了一个与UPDATE 相关的更简单的问题,以及我似乎无法获得超过最高价值的事实。 stackoverflow.com/questions/55997684/… 我猜这里的答案也是一个 SQLite 限制,但如果您对此有任何想法,我很乐意收到您的反馈!谢谢。
  • 我认为我的第二个查询有效。看到这个:db-fiddle.com/f/br3kpcEU6DUbaaw334rCrz/0。下单条件很简单:ORDER BY name。如果您可以在此处调整一堆排序条件,则可以使其适用于您的情况。
  • 谢谢,是的,第二个查询成功了!我最终走了那条路。
【解决方案2】:

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

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

【讨论】:

  • 为什么链接到draft文档而不是正式版?
  • @Shawn 已修复,谢谢。这只是我通过 Google 看到的……没看出是草稿。
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2017-02-17
  • 2023-03-14
相关资源
最近更新 更多