[pgsql-jp: 32292] Re: 他のテーブルのデータにて主テーブルデータを更新
Nakagawa Yasuharu
yasuharu.nakagawa @ jp.yokogawa.com
2004年 2月 19日 (木) 14:09:19 JST
こんにちは 中川@東京武蔵野です
最近おなじようなことをやったので、参考にしてください。
In Message-ID <20040219131913.BC78.CURRENCY @ lily.freemail.ne.jp>,
YOKOTA <currency @ lily.freemail.ne.jp> writes on Thu, 19 Feb 2004 13:27:01 +0900 ...
> 主テーブル(以下Aテーブル)にある、指定した列(住所とコメント)のデータを、
> 他のテーブル(以下Bテーブル)にあるデータ(住所とコメント)で更新する。
> ただしその時に、A,B両テーブルに存在する列(管理番号,id)のデータを照合しな
> がら行い、
> 照合の結果一致したタプルのみ更新を行う。
内容が異なるもののみ、Bの内容で更新するなら:
UPDATE table_a
SET address = diff.address,
comment = diff.comment
FROM (
SELECT
b.id AS id,
b.name AS name,
b.address AS address,
b.comment AS comment
FROM table_a a
INNER JOIN table_b b ON a.id = b.id
WHERE NOT (
coalesce(a.address,'') = coalesce(b.address,'')
AND coalesce(a.comment,'') = coalesce(b.comment,'')
)
) diff
WHERE table_a.id = diff.id ;
ついでに、BにあってAに無いものを追加するなら:
INSERT table_a (id, name, address, comment)
SELECT
b.id AS id,
b.name AS name,
b.address AS address,
b.comment AS comment
FROM table_a a
RIGHT JOIN table_b b ON a.id = b.id
WHERE
a.id IS NULL ;
AにあってBにないものを削除するなら:
DELETE FROM table_a
WHERE table_a.id IN
(
SELECT
a.id AS id
FROM table_a a
LEFT JOIN table_b b ON a.id = b.id
WHERE
b.id IS NULL
) ;
--
pgsql-jp メーリングリストの案内