联接表插入第三

时间:2018-10-17 06:30:11

标签: postgresql

表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子句条目无效。我在做什么错了?

2 个答案:

答案 0 :(得分:2)

我们可以在以下CTE的帮助下进行更新联接:

class CustomNavigationController: UINavigationController {

    override var prefersStatusBarHidden: Bool {
        return true
    }

}

此处的策略是创建一个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; 寻址,并映射到sameid中的id。然后,我们只使用Postgres更新联接来引入值。

答案 1 :(得分:0)

我知道已经存在一个可接受的答案,但是如果您希望保持“ Table1”概念的最新状态而不必定期插入更多数据,则可以利用视图

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;

编辑:通读注释以查看插入和更新在视图上下文中的工作方式。