2013-06-11 54 views
1

遗漏值如果我有这样的表SQL更新来自同一个表

---------- ---------- 
jones  new york 
jones     
richard  seattle 
jones     
richard     
Ellen  Vancouver 
Ellen     

而且我想这个新表

---------- ---------- 
jones  new york 
jones  new york    
richard  seattle 
jones  new york   
richard  seattle   
Ellen  Vancouver 
Ellen  Vancouver   

我怎样才能升级呢?我正在使用Postgresql。

+0

因此,基本上无论第二个字段为空,在匹配名称不为空的地方使用相同的值? –

+0

您的问题缺少Esssential信息:Postgres版本?列名?数据类型?首要的关键?表格定义?一个名字可以有多个城市吗?请正确描述问题。 –

回答

1

best解决方案将正确地对表格进行规范化,以便在它们之间创建一对一的连接表,从而将每个名称连接到一个城市,如果实际上每个名称应该只有一个城市。

根据你的具体情况,你可以在FROM子句中提供子查询,该子查询返回MAX(city)每个name组。从那里SET子句将主表的city更新为子查询返回的值。

UPDATE 
    tbl t 
SET 
    city = c.city 
FROM 
    /* Subquery in FROM returns first (max()) non-null city per name */ 
    (SELECT name, MAX(city) AS city FROM tbl WHERE city IS NOT NULL GROUP BY name) c 
WHERE 
    /* Only update non-null cities */ 
    t.city IS NULL 
    /* Here's the joining relation to the subquery */ 
    AND t.name = c.name; 

这里有一个演示:http://sqlfiddle.com/#!1/6ad17/1

0

这里是一个可行的临时表的解决方案。你应该能够对你的问题应用相同的逻辑。

create temp table foo(employee_name text, city text); 

insert into foo (employee_name, city) values 
('jones', 'new york'), 
('jones', NULL), 
('richard', 'seattle'), 
('richard', NULL), 
('ellen', 'vancouver'), 
('ellen', NULL); 

update foo f set city = x.city 
from foo x 
where f.employee_name = x.employee_name 
and f.city is null;