2013-06-11 113 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;