是否可以使用insert
或update
与full 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,其中包含所有记录,然后我可以根据其他表格中其他列的记录来减少
答案 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。但是,简化的示例应该足以指出正确的方向。