[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 メーリングリストの案内