ОБНОВЛЕНИЕ… С синтаксиса с подзапросом - PullRequest
1 голос
/ 06 мая 2019

У меня есть таблица, 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 ]

1 голос
/ 06 мая 2019

SQLite не так гибок, как другие rdbms, он не поддерживает даже объединения в операторе update.Вместо этого вы можете сделать что-то вроде этого:

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

С этим условием выводятся только id s.Таким образом, столбец 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
)
0 голосов
/ 06 мая 2019

Оказывается, что основной ответ на этот конкретный вопрос заключается в том, что SQLite не поддерживает UPDATE ... FROM.Поэтому необходимы некоторые альтернативные методы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...