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

时间:2011-05-15 00:13:15

标签: 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

出现此错误:

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 个答案:

答案 0 :(得分:9)

试试这个:

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

是的,老学校加入了条件。

答案 1 :(得分:6)

From postgres site

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条件和更新   表达式。这类似于   可以指定的表的列表   在SELECT的FROM子句中   声明。注意目标表   不得出现在from_list中,   除非你打算自我加入(在   它必须出现在哪种情况下   from_list中的别名。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

使用子查询语句并将索引添加到这些列。

答案 4 :(得分:0)

我不得不尝试使用列/表命名,并最终使它起作用。我必须:

  • 在目标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

答案 5 :(得分:-2)

您应该可以在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

答案 6 :(得分:-3)

您不需要FROM子句。删除“FROM queued_items”即可完成。