SQL:他のテーブルからカラム値をコピーしたい

問題

SQLにおいて、他のテーブルから値をコピーしたい。例えば、

create table foo (f_id integer, a integer, b integer);
create table bar (b_id integer, c integer, d integer);

というテーブルがあり、両者ともに値が格納されているものとする。このc,dの値をa,bにコピーしたいのである。もちろんidが同一の行についてだ。

これはRDBによって便利なコマンドがあるようだが、標準的なSQLで行うには、

update foo set a=(select c from bar where f_id=b_id), b=(select d 云々

となるだろうか。面倒でやってられない。おそらくスピードも遅いだろう。

SQL標準での解法

MERGE (SQL)というものがあるようだ。ただし、以下のDBしかサポートしていないという。

  • Oracle
  • DB2
  • Microsoft SQL Server
  • Firebird

MySQLが無いというのが、あまり知られていない原因だろう。しかし、ここで対象とするのはFirebirdなので問題無い。MERGEを見てみると、Firebird2.1以降でサポートしているようだ。

Firebirdでの操作

実際にやってみる。

merge into foo using bar on f_id=b_id when matched then update set a=c, b = d

問題は無いようだ。