组合表中某些键是共同的,有些键丢失

时间:2015-06-26 15:44:54

标签: sql postgresql sql-update

我的postgres db(版本9.3)中有一个landcover值表。关键值是" huc12code",它们代表空间区域。这是landcover表的第一个条目(它有1700多行):

 huc12code   | open_water  |  developed  | bare_earth  |  managed | heritage
030402080205 |    0.107027 |   0.0215444 |    0.406911 |          |

此表中管理土地和遗产土地的面积为空,但存储在单独的表格中。他们还有huc12code作为第一列:

来自temp_heritage表:

 huc12code   |  heritage
-------------+-------------
030101020801 |   0.0402684

来自temp_managed表:

 huc12code   |   managed
-------------+------------- 
030101020802 | 0.000385026

我想加入托管和管理层。遗产领域进入我的土地表,但我看到两个问题:

  1. huc12code表格中的大多数landcover字段都位于temp_managedtemp_heritage中,但有些则不是。这是因为" temp"表格不包括heritagemanaged字段等于0的地方。

  2. 我确实希望landcover表包含0 heritagemanaged字段为0的值,但由于这些值实际上并不存在" temp"表,我需要一些逻辑,为heritagehuc12codelandcover中找不到的temp_heritage pytest-django字段插入零(对于管理字段也是如此) )。

1 个答案:

答案 0 :(得分:0)

Assuming huc12code to be unique in all tables.

Only update rows where values are available

To do it all in a single UPDATE join the two source tables with a FULL [OUTER] JOIN的jQuery accordion click事件以保留所有行。然后在UPDATE命令的FROM子句中使用它:

UPDATE landcover l
SET    managed  = COALESCE(t.managed, 0) 
     , heritage = COALESCE(t.heritage, 0) 
FROM (
   SELECT huc12code, m.managed, h.heritage
   FROM   temp_managed m
   FULL   JOIN temp_heritage h USING (huc12code)
   ) t
WHERE l.huc12code = t.huc12code;

如果源中有(合并的)行,landcover中的每一行都会更新一次。其余部分根本没有触及。

更新 所有

改为使用两个LEFT JOIN

UPDATE landcover l
SET    managed  = COALESCE(t.managed, 0) 
     , heritage = COALESCE(t.heritage, 0) 
FROM (
   SELECT l.huc12code, m.managed, h.heritage
   FROM   landcover l
   LEFT   JOIN temp_managed  m USING (huc12code)
   LEFT   JOIN temp_heritage h USING (huc12code)
   ) t
WHERE l.huc12code = t.huc12code;

没有源或源NULL值的列设置为0