我正在尝试使用其他表更新postgresql中的表:
主表:
id val1 val2 val3 val4
1 50 30
2 3 69
3 5 8 90
4 8 02
现在,假设我有两个子表:
table 1
id val1 val2
3 5
table 2
id val3 val4
1 8 90
4 55 99
5 30 7
所以我无法弄清楚如何通过使用表1和表2加入或更新主表来获取下表?一个简单的完整连接将用无值替换val2(id = 3):
id val1 val2 val3 val4
1 50 30 8 90
2 3 69
3 5 5 8 90
4 8 02 55 99
5 30 7
答案 0 :(得分:1)
第1步 - 加入两个源表。
使用union
从表格中选择所有distinct
,然后从表格中选择四列。如果两个表中都有相同的ids
,请使用select distinct id, val1, val2, val3, val4
from (
select id
from table_1
union
select id
from table_2
) s
left join table_1 using(id)
left join table_2 using(id);
id | val1 | val2 | val3 | val4
----+------+------+------+------
1 | | | 8 | 90
3 | | 5 | |
4 | | | 55 | 99
5 | | | 30 | 7
(4 rows)
。
with
第2步 - 插入新行并更新主表中的现有行。
使用source
语句,将步骤1中的结果集命名为ids
。
由于主表中不存在源表中的coalesce()
,首先必须插入这些新行。接下来使用with source as (
select distinct id, val1, val2, val3, val4
from (
select id
from table_1
union
select id
from table_2
) s
left join table_1 using(id)
left join table_2 using(id)
),
new_rows as (
insert into main_table
select * from source
where id not in (select id from main_table)
)
update main_table m set
val1 = coalesce(s.val1, m.val1),
val2 = coalesce(s.val2, m.val2),
val3 = coalesce(s.val3, m.val3),
val4 = coalesce(s.val4, m.val4)
from source s
where s.id = m.id;
更新现有行以仅更新非空值:
select *
from main_table
order by 1;
id | val1 | val2 | val3 | val4
----+------+------+------+------
1 | 50 | 30 | 8 | 90
2 | 3 | 69 | |
3 | 5 | 5 | 8 | 90
4 | 8 | 2 | 55 | 99
5 | | | 30 | 7
(5 rows)
检查结果:
-microedition