Postgresql

根據包含另一個(連接)表的查詢更新一列

  • May 22, 2020

考慮以下選擇查詢:

SELECT s.id, s.event, s.column, e.oldcolumn
FROM section as s
INNER JOIN event as e
ON s.event = e.id
WHERE s.id = 1

現在我希望更新節表,使值等於oldcolumn事件表中的值。

我試過:

UPDATE public."section"
SET public."section".column = public."event".oldcolumn
FROM public."section"
INNER JOIN public."event"
on public."section".event = public."event".id
WHERE s.id = 1

但是,這在 postgresql 上返回了以下錯誤:

ERROR:  table name "section" specified more than once
SQL state: 42712

我將如何做這樣的事情,在更新查詢中使用連接?

如手冊中所述,您不應在 FROM 子句中重複目標表。

所以你的更新應該是這樣的:

UPDATE public."section" s
 SET column = evt.oldcolumn
FROM public."event" evt
WHERE s.event = evt.id
 AND s.id = 1;

免責聲明,我不使用 PostgreSQL,但我對 SQL Server 非常熟悉。

根據我在此處的 PostgreSQL 文件中的理解,我認為您遇到的錯誤是由public."section" INNER JOIN您的FROM語句中包含的內容引起的。使用UPDATE時指定要更新的表,因此public."section"不需要FROM添加。根據文件“不要將目標表作為 from_item 重複,除非您打算進行自聯接(在這種情況下,它必須在 from_item 中以別名出現)。”

如果您將程式碼更改為我在下面的程式碼,我認為它會解決您的問題。雖然我不確定你的引號,但我只是複制了你的格式。主要區別在於,只有您要加入的表在 中,FROM然後將ON移到WHERE.

UPDATE public."section"
SET public."section".column = public."event".oldcolumn
FROM public."event"
WHERE public."section".event = public."event".id AND public."section".id = 1

引用自:https://dba.stackexchange.com/questions/267654