postgresql中的完整连接和更新表?

时间:2016-06-06 11:47:20

标签: postgresql

我正在尝试使用其他表更新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

1 个答案:

答案 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