【问题标题】:Join tables insert into third连接表插入第三个
【发布时间】:2018-10-17 15:32:17
【问题描述】:

表 1

id  class_id  class
1   
2   
3   

表2

sameid  class_id
2       20
3       30
1       40

表3

class_id    desc
30          forest
40          urban
20          water

我想通过加入 Table1-Table2-Table3 将 Table3.class_id 和 Table3.desc 插入到 Table1.class_id 和 Table1.class 中。

所以我试试:

INSERT INTO Table1 (class_id,class)
SELECT Table3.class_id, Table3.desc
FROM Table2
INNER JOIN Table3 ON Table2.class_id=Table3.class_id
WHERE Table1.id = Table2.sameid

但我收到错误:表“Table1”的引用 FROM 子句条目无效。我做错了什么?

【问题讨论】:

  • 如果合适的话,你会考虑把 Table1 变成一个视图吗?
  • @AlexanderDeSousa 我想要它作为一张桌子。我不知道我是否可以制作一个视图然后另存为表格?我有很多表,如上面的 2,3,我想将值添加到多列的 Table1 中。我不知道最好的工作流程是什么,我是菜鸟。我想我会在答案中尝试许多 CTE。
  • 没问题,如果你是新手,那就做适合你的。但是,请尝试在此过程中学习一些好的技术。听起来视图可能是您所需要的,一旦您创建了视图,您就可以像选择表格一样从中进行选择。您无需再次运行插入脚本,视图在运行您指定的查询时始终是最新的。
  • 我同意亚历山大的观点。视图很可能是更好的解决方案。如果一些真正紧迫的性能问题迫使我这样做,我只会考虑这样的表。然后我可能会改用物化视图

标签: postgresql


【解决方案1】:

我们可以在以下 CTE 的帮助下进行更新加入:

WITH cte AS (
    SELECT t2.sameid, t2.class_id, t3.desc
    FROM table2 t2
    INNER JOIN table3 t3
        ON t2.class_id = t3.class_id
)

UPDATE table1 AS t1
SET
    class_id = t2.class_id,
    class    = t2.desc
FROM cte AS t2
WHERE t1.id = t2.sameid;

这里的策略是创建一个 CTE,其中包含我们要在更新中使用的所有列,可通过sameid 寻址,它映射到table1 中的id。然后,我们只需使用 Postgres 更新连接来引入值。

【讨论】:

  • 它没有。打错字了,抱歉。
  • 只要执行查询,cte 是否会一直保留在内存中?例如,我可以在查询中再次使用相同的 cte 进行另一个更新,而无需重新创建它吗?
  • @BERA 我不是 Postgres 专家。 AFAIK CTE 将在您运行时具体化,但您可以在遵循其定义的查询中多次引用它。
【解决方案2】:

我知道已经存在可接受的答案,但如果您想保持“Table1”概念的最新状态而无需定期插入更多数据,您可以利用views

CREATE VIEW Table1_vw AS
SELECT Table3.class_id, Table3.desc
FROM Table2
INNER JOIN Table3 ON Table2.class_id=Table3.class_id
WHERE Table1.id = Table2.sameid

然后就可以像查询真实表一样查询Table1_vw

SELECT * FROM Table1_vw;

编辑:通读 cmets 以了解插入和更新如何在视图上下文中工作。

【讨论】:

  • 可以使这样的视图可更新
  • @a_horse_with_no_name 很有趣,我不知道 - 只是有一个快速的谷歌,我说你可以用级联更新字段是对的吗?但是插入新数据似乎仍然不可能。
  • instead of 触发器可以支持插入、删除和更新语句:postgresql.org/docs/current/static/… cascaded 选项仅适用于 automatically updateable views,而带有连接的视图不支持
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2021-05-17
  • 2020-08-04
相关资源
最近更新 更多