1

如果我有这张桌子

----------  ----------  
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。

4

2 回答 2

1

最好的解决方案是适当地规范化表,以便在它们之间创建一个一对一的连接表,将每个名称连接到一个城市,如果每个名称确实应该有一个城市。

鉴于您所拥有的,您可以在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

于 2013-06-11T16:48:09.763 回答
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;
于 2013-06-11T17:07:06.437 回答