如果我有这张桌子
---------- ----------
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 :(得分: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;
答案 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;