在postgres中更新或插入外部联接

时间:2017-07-21 09:06:55

标签: postgresql join

是否可以使用insertupdatefull outer join一起向另一个表中的现有表添加新列。

在我的主表中,我错过了另一个表中一列中的一些记录,我有所有那些记录,我想把完整的记录集放到维护表中。像这样的东西;

UPDATE maintable 
SET all_records= othertable.records
FROM 
FULL JOIN othertable on maintable.col = othertable.records;

其中,maintainble.col具有相同的id othertable.records。

我知道我可以简单地加入这些表格,但我在维护中有很多评论我不想在必要时重新粘贴。据我所知,使用where相当于left join,所以不会告诉我我失踪了什么

编辑: 我想要的实际上是一个新的maintable.col,其中包含所有记录,然后我可以根据其他表格中其他列的记录来减少

1 个答案:

答案 0 :(得分:0)

试试这个:

UPDATE maintable 
SET all_records = o.records
FROM othertable o
WHERE maintable.col = o.records;

这是通过连接更新时在postgres中使用的一般语法。

HTH

修改

顺便说一下你需要改变这个 - 我用你的例子,但是你用连接用的列更新了维护!你的集合需要像SET missingcol = o.extracol

修正广义答案(离线聊天后)

举一个简单的例子,假设你有两个表维护和子表,每个表都有相同的列,但子表有额外的记录。对于两个表,id是主键。要使用丢失的记录填充维护,对于Postgres的9.5之前的版本,您必须使用以下语法:

INSERT INTO maintable (SELECT * FROM subtable s WHERE NOT EXISTS 
(SELECT 1 FROM maintable m WHERE m.id = s.id));

自9.5以来,有一个(首选)替代方案:

INSERT INTO maintable (SELECT * FROM subtable) ON CONFLICT DO NOTHING;

这是首选的,因为(除了更简单)它避免了前者出现的情况,其中在INSERT和子SELECT之间创建了竞争条件。

显然,当列不同时,您需要在INSERT语句中指定从哪个列插入哪些列。类似的东西:

INSERT INTO maintable (id, ColA, ColB) 
(SELECT id, ColE, ColG FROM subtable ....)

同样,两个表中的公共字段可能不是id。但是,简化的示例应该足以指出正确的方向。