Ошибка: ОШИБКА: имя таблицы указано более одного раза - PullRequest
14 голосов
/ 15 мая 2011

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

Попытка получить импортированный_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)

... потому что это безумно медленно

Ответы [ 7 ]

11 голосов
/ 15 мая 2011

Попробуйте это:

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

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

6 голосов
/ 15 мая 2011

С сайта 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).

2 голосов
/ 01 декабря 2017
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
1 голос
/ 15 мая 2011

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

0 голосов
/ 03 мая 2019

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

  • не указывать имя таблицы в месте назначения 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
0 голосов
/ 15 мая 2011

Вы сможете сменить имя после 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
0 голосов
/ 15 мая 2011

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

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