错误:错误:多次指定表名

jmc*_*tie 16 sql postgresql

我有一个表"queued_items".当前"user_id"和"item_id"不正确,但存储在其他表中:users.imported_id和items.imported_id

尝试从其他表中获取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
Run Code Online (Sandbox Code Playgroud)

得到此错误:

Error : ERROR:  table name "queued_items" specified more than once
Run Code Online (Sandbox Code Playgroud)

尝试删除FROM行,出现此错误:

Error : ERROR:  syntax error at or near "INNER"
LINE 4: INNER JOIN users ON queued_items.user_id = users.imported_id
         ^
Run Code Online (Sandbox Code Playgroud)

我还尝试在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
Run Code Online (Sandbox Code Playgroud)

得到此错误:

Error : ERROR:  column "queued_items" of relation "queued_items" does not exist
LINE 2: SET queued_items.user_id = users.id,
            ^
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?(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)
Run Code Online (Sandbox Code Playgroud)

......因为它很疯狂

mu *_*ort 13

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

是的,老学校加入条件.


Luc*_*c M 6

来自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 ] [, ...] ]
Run Code Online (Sandbox Code Playgroud)

*from_list*

表表达式列表,允许其他表中的列出现在WHERE条件和更新表达式中.这类似于可以在SELECT语句的FROM子句中指定的表列表.请注意,目标表不得出现在from_list中,除非您打算进行自联接(在这种情况下,它必须在from_list中显示别名).


小智 5

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
Run Code Online (Sandbox Code Playgroud)