メニューボタン
IBMi海外記事2015.12.09

テーブルの結合方法は?さて、いくつあるでしょう

Ted Holt 著

正規化は、それぞれ一個のデータを適切なテーブルに確実に保存するプロセスです。誤った場所にデータを保存すると異常が発生します。問題にしては聞こえが良い言葉ですが、すでに十分問題ありです。正規化されたデータを意味あるものにするには、テーブルを結合する必要があります。皆さんは、SQL で結合をコーディングする方法、またそれぞれの利点と欠点を理解しているでしょうか?

方法1:WHERE

最初に SQL を学習したとき、結合は SELECT ステートメントの WHERE 節で行いました。ここに例を挙げてみます。

技術情報01

この照会では、セールス・オーダー・ヘッダー・テーブルのすべての列と、セールス・オーダー行のすべての列を要求しています。WHERE 節は、データを共通のセールス・オーダー番号と突き合わせるよう指示しています。つまり、結果セットの任意の行のヘッダー情報は、同じセールス・オーダーの 1 行に当てはまります。

この構文には欠点があり、そのうち最も大きな欠点と思われるものは、不一致のオーダーが削除されていることです。つまり、ヘッダーはあるが行がないオーダー、あるいは 1 つまたは複数の行はあるがヘッダーがないオーダーは、結果セットには表示されません。DBMS プロバイダーは、外部結合をサポートするために拡張機能を考え出す必要がありました。

私の場合、利点がないのでこの構文は使いません。見たときに理解できるよう、皆さんはこの構文を知っている方が良いと思いますが、使うことはお勧めしません。

方法2:JOIN...USING

これは自然結合を実装したものです。自然結合については、同じデータ型の共通フィールド名で 2 つのテーブル/ビューが結合しているということを、まず最初に知っておく必要があります。

技術情報02

OrderNumber は共通列です。つまり、オーダー番号の名前は両方のテーブルで OrderNumber であり、両方のテーブルに同じデータ・タイプで定義されています。

次に知っておくべきことは、アスタリスクを使用してすべての列を選択する場合の、自然結合の動作です。前述の照会の結果セットを以下に示します。

ORDER
NUMBER
ENTRY
DATE
CUSTOMER
ID
LINE
NUMBER
ITEM
NUMBER
QUANTITY
1001 2015-09-01 102 1 B-1 5
1001 2015-09-01 102 2 B-2 6
1002 2015-09-01 103 3 F-3 2

結果セットの構成要素は以下のとおりです。

  • USING にある列
  • USING にない最初のテーブルの列
  • USING にない 2 番目のテーブルの列

これは理解できます。なぜ同じデータの列を 2 つ返すのでしょうか? 理解できないようなものを見てみたくありませんか? これを見てください。

技術情報03

結果セットは以下のようになります。

ENTRY
DATE
CUSTOMER
ID
LINE
NUMBER
ITEM
NUMBER
QUANTITY
2015-09-01 102 1 B-1 5
2015-09-01 102 2 B-2 6
2015-09-01 103 3 F-3 2

おっと、見てください! オーダー番号がありません。まるでどちらのテーブルにも共通列がないみたいです。

JOIN...USING 構文は滅多に使いません。もっと良い方法があるので、必要ないのです。例えば、次のような方法です..

方法3:JOIN...ON

この方法なら完ぺきです。列名やデータ・タイプを問わず、希望するもの何でも結合できます。

JOIN...ON の例を挙げます。

技術情報04

そして、結果セットは以下のようになります。

ORDER
NUMBER
ENTRY
DATE
CUSTOMER
ID
ORDER
NUMBER
LINE
NUMBER
ITEM
NUMBER
QUANTITY
1001 2015-09-01 102 1001 1 B-1 5
1001 2015-09-01 102 1001 2 B-2 6
1002 2015-09-01 103 1002 3 F-3 2

結合式に列名を入れることができるだけでなく、式やリテラルも入れることができます。例えばこの例では、製造ジョブ番号 123456 は、セールス・オーダー S123456 と一致しています。

技術情報05

これこそ、私が使っていてお勧めできる構文です。

あわせて読みたい記事

PAGE TOP