我有一张桌子“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)
...因为它很疯狂
答案 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)
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”即可完成。