我的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
我想加入托管和管理层。遗产领域进入我的土地表,但我看到两个问题:
huc12code
表格中的大多数landcover
字段都位于temp_managed
和temp_heritage
中,但有些则不是。这是因为" temp"表格不包括heritage
和managed
字段等于0的地方。
我确实希望landcover
表包含0 heritage
和managed
字段为0的值,但由于这些值实际上并不存在" temp"表,我需要一些逻辑,为heritage
中huc12code
但landcover
中找不到的temp_heritage
pytest-django
字段插入零(对于管理字段也是如此) )。
答案 0 :(得分:0)
Assuming huc12code
to be unique in all tables.
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
。