CREATE TABLE bobjohn
(ID INTEGER NOT NULL
, zname varchar
);
INSERT INTO bobjohn(id, zname) VALUES
(1,'Bob') ,(1, NULL) ,(1, NULL)
,(2,'John') ,(2, NULL) ,(2, NULL)
;
UPDATE bobjohn dst
SET zname = src.zname
FROM bobjohn src
WHERE dst.id = src.id
AND dst.zname IS NULL
AND src.zname IS NOT NULL
;
SELECT * FROM bobjohn;
NO TE:如果給定ID存在多個名稱,則此查詢將失敗。 (並且它不會觸及其中存在非空名稱的否
如果您的postgres版本> -9,則可以使用CTE來獲取源元組(這相當於一個子查詢,但更容易編寫和閱讀(恕我直言)的CTE也解決了重複值,問題(在一個相當粗暴的方式):
--
-- CTE's dont work in update queries for Postgres version below 9
--
WITH uniq AS (
SELECT DISTINCT id
-- if there are more than one names for a given Id: pick the lowest
, min(zname) as zname
FROM bobjohn
WHERE zname IS NOT NULL
GROUP BY id
)
UPDATE bobjohn dst
SET zname = src.zname
FROM uniq src
WHERE dst.id = src.id
AND dst.zname IS NULL
;
SELECT * FROM bobjohn;
請說出您的「特定實施」。你使用什麼版本?另外,是否可以存在具有多個不同名稱的ID?如何處理?首先按字母順序選擇? – 2012-07-21 18:16:22
@dchandler:Postgres 8.4 *不支持相關的子查詢(實際上已經這麼做了)。那麼Greenplum必須基於一個真正的舊版本。 – 2012-07-21 21:19:10
@a_horse_with_no_name,這很有趣。那看起來就是Greenplum!多麼可恥 – 2012-07-22 21:58:03