テーブル値コンストラクターによるオンザフライでの表作成
コンピューターのプログラミングを行うお客様にとって、私はできるだけ有益かつ生産性の高い存在でありたいと思っているため、常にWebで新たなアイデアやテクニックを捜し続けています。そのようなことを頻繁に行っていると、他のコンピューティング プラットフォームを対象にしているサイトにたどり着くことがあります。今日は、Microsoft SQL Serverのプロフェッショナルから私が学んだいくつかのSQLテクニックをご紹介したいと思います。
これらのテクニックは、行と列から構成されるデータ値(通常はリテラル)のグループである、テーブル値コンストラクター(Table Value Constructor:TVC)をベースにしたものです。最もシンプルな形のテーブル値コンストラクターは、データベース表に保存されないリテラル表形式データです。
テーブル値コンストラクターは、VALUESという語句で始まり、その後に1つ以上の行値式が続きます。
REPSという営業担当者の表があり、その表にはREPIDおよびREGIONという10進数型の列があるとします。テーブル値コンストラクターを使用して、営業担当者のグループを追加することができます。
insert into reps values
(11, 1), (12, 3), (17, 4),
(25, 2), (27, 2), (28, 4)
6人の営業担当者が、地域1~4に割り当てられています。
REPID | REGION |
11 | 1 |
12 | 3 |
17 | 4 |
25 | 2 |
27 | 2 |
28 | 4 |
事業が急成長し、新たな地域へ事業を展開する段階になると、営業地域のリストの修正が必要になります。このことは、定義される地域番号が増え、既存のいくつかの地域に異なる地域番号が割り当てられることを意味します。repsに新たな地域番号を割り当てし直すには、どのように取り組んだらよいのでしょうか。
Updating Through A Join, Take Threeという記事で説明したように、新旧の地域番号の表を作成して、MERGEステートメントでその表をソースとして使用することもできます。他の目的でそうした表を必要としない場合は、代わりに、次のようにテーブル値コンストラクターを使用することもできます。
merge into reps as r using (values (1, 1), (2, 6), (3,4), (4,2)) as changes (OldRegion, NewRegion) on r.region = changes.OldRegion when matched then update set r.Region = changes.NewRegion
システムは、TVCでリテラル値を使用してrepsの再割り当てを行いました。
REPID | REGION |
11 | 1 |
12 | 4 |
17 | 2 |
25 | 6 |
27 | 6 |
28 | 2 |
今回学んだことで、他にも興味深いことがありました。テーブル値コンストラクターでリテラルの代わりに副選択を使用することができるようです。以下に作成した例を示します。
insert into reps values ( (select repid from shipments where shipmentid = 202), 4);
REPID値は出荷ID 202から取得され、どの営業担当者でも地域4に割り当てられます。
私はこのテクニックを本稼働プログラムで使用したことはまだありませんが、もしご使用になった方がいらしたとしたら、私にもそのコードを共有させていただけないでしょうか。また、私が本記事で触れていないTVCのテクニックをご存じの方がいらしたとしたら、他の読者にも紹介できるように、私にメールでお知らせいただけると幸いです。
IBM関係の文献の中で「テーブル値コンストラクター」および「TVC」という用語が使用されているのを私はまだ目にしたことがありませんが、そのうちIBMはその用語を使用し始めると思います。結局のところ、DB2にもこの機能があるということをSQL Serverユーザーに知らせるには、その用語を使用するより他にないでしょうから。