Ошибка: ERROR: имя таблицы указано более одного раза

У меня есть таблица queued_items. Текущие "user_id" и "item_id" являются неправильными, но хранятся в других таблицах: users.imported_id и items.imported_id

Попытка захватить import_id из других таблиц и обновить. Вот что я пробовал

UPDATE queued_items
SET queued_items.user_id = users.id,
    queued_items.item_id = items.id
FROM queued_items
INNER JOIN users ON queued_items.user_id = users.imported_id
INNER JOIN items ON queued_items.item_id = items.imported_id

Получение этой ошибки:

Error : ERROR:  table name "queued_items" specified more than once

Пробовал удалить строку FROM, получил эту ошибку:

Error : ERROR:  syntax error at or near "INNER"
LINE 4: INNER JOIN users ON queued_items.user_id = users.imported_id
         ^

Я также попытался добавить псевдоним в условия FROM и JOIN

UPDATE queued_items
SET queued_items.user_id = users.id,
    queued_items.item_id = items.id
FROM queued_items as qi
INNER JOIN users ON qi.user_id = users.imported_id
INNER JOIN items ON qi.item_id = items.imported_id

Получена эта ошибка:

Error : ERROR:  column "queued_items" of relation "queued_items" does not exist
LINE 2: SET queued_items.user_id = users.id,
            ^

Любые идеи? (postgres 9)

PS Попытка избежать этого подзапроса:

UPDATE queued_items
SET user_id = (SELECT id FROM users WHERE queued_items.user_id = users.imported_id),
    item_id = (SELECT id FROM items WHERE queued_items.item_id = items.imported_id)

... потому что он сумасшедший медленный

Ответ 1

Попробуйте следующее:

UPDATE queued_items
SET user_id = users.id,
    item_id = items.id
FROM users, items
WHERE queued_items.user_id = users.imported_id
  AND queued_items.item_id = items.imported_id

Да, старые условия для школьной школы.

Ответ 2

Из сайта postgres

UPDATE [ ONLY ] table [ [ AS ] alias ]
    SET { column = { expression | DEFAULT } |
          ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
    [ FROM from_list ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

* from_list *

Список табличных выражений, позволяющий столбцы из других таблиц, чтобы условие WHERE и обновление выражения. Это похоже на список таблиц, которые могут быть указаны в разделе FROM SELECT выражение. Обратите внимание, что целевая таблица не должны появляться в списке from_list, если вы не намерены присоединяться (в в этом случае он должен появиться с псевдоним в from_list).

Ответ 3

UPDATE queued_items
SET user_id = users.id,
    item_id = items.id
FROM queued_items as QI
INNER JOIN users ON QI.user_id = users.imported_id
INNER JOIN items ON QI.item_id = items.imported_id

Ответ 4

Используйте инструкцию подзапроса и добавьте индексы к этим столбцам.

Ответ 5

Мне пришлось поиграть с именами столбцов и таблиц, и в конце концов он заработал. Мне пришлось:

  • оставьте имя таблицы в столбцах назначения SET
  • убедитесь, что я псевдоним таблицы обновляется

Ваш эквивалент будет:

UPDATE queued_items
SET user_id = users.id,
    item_id = items.id
FROM queued_items as alias_queued_items
INNER JOIN users ON alias_queued_items.user_id = users.imported_id
INNER JOIN items ON alias_queued_items.item_id = items.imported_id

вместо:

UPDATE queued_items
SET queued_items.user_id = users.id,
    queued_items.item_id = items.id
FROM queued_items
INNER JOIN users ON queued_items.user_id = users.imported_id
INNER JOIN items ON queued_items.item_id = items.imported_id

Ответ 6

Вы должны иметь возможность изменить имя после UPDATE на псевдоним. Также вы можете использовать псевдонимы в предложении set. Это означает, что вы также можете установить их в своих предложениях JOIN.

UPDATE qi 
SET qi.user_id = us.id,
    qi.item_id = itms.id
FROM queued_items qi
INNER JOIN users us ON qi.user_id = us.imported_id
INNER JOIN items itms ON qi.item_id = itms.imported_id

Ответ 7

Вам не нужно предложение FROM. Удалите "FROM queued_items", и все готово.