PostgreSQL中带差异化SELECT列的OUTER JOIN短语法优化咨询
PostgreSQL 两表关联生成覆盖层结果的简洁写法
需求说明
需要将表new(表A)与表old(表B)关联生成表joined(表C),其中表B作为表A的覆盖层,具体表结构如下:
表A:new
| id | new | operation |
|---|---|---|
| 1 | newval1 | INSERT |
| 2 | newval2 | UPDATE |
表B:old
| id | old | operation |
|---|---|---|
| 2 | oldval2 | UPDATE |
| 3 | oldval3 | DELETE |
期望结果表C:joined
| id | new | old | operation |
|---|---|---|---|
| 1 | newval1 | NULL | INSERT |
| 2 | newval2 | oldval2 | UPDATE |
| 3 | NULL | oldval3 | DELETE |
当前实现SQL
SELECT COALESCE(n.id, o.id), n.new, o.old, COALESCE(n.operation, o.operation) FROM "new" n FULL OUTER JOIN old o ON n.id = o.id
更简洁的写法
可以用USING(id)简化连接条件,PostgreSQL在使用USING时会自动合并同名字段,无需再用COALESCE处理id:
SELECT id, n.new, o.old, COALESCE(n.operation, o.operation) FROM "new" n FULL OUTER JOIN old o USING(id);
说明
USING(id)替代ON n.id = o.id,语法更紧凑,同时自动合并两个表的id字段,省去手动合并的代码。operation字段仍需COALESCE来优先取new表的值,符合“表B作为覆盖层”的逻辑。
注意:不建议用NATURAL FULL OUTER JOIN,它会自动匹配所有同名字段(包括operation),但我们需要的是COALESCE后的operation结果,而非直接合并,因此这种写法不符合需求。
内容的提问来源于stack exchange,提问作者dersu
相关产品推荐
相关产品推荐

