Ошибка: 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", и все готово.