テーブルの結合方法は?さて、いくつあるでしょう
正規化は、それぞれ一個のデータを適切なテーブルに確実に保存するプロセスです。誤った場所にデータを保存すると異常が発生します。問題にしては聞こえが良い言葉ですが、すでに十分問題ありです。正規化されたデータを意味あるものにするには、テーブルを結合する必要があります。皆さんは、SQL で結合をコーディングする方法、またそれぞれの利点と欠点を理解しているでしょうか?
方法1:WHERE
最初に SQL を学習したとき、結合は SELECT ステートメントの WHERE 節で行いました。ここに例を挙げてみます。
この照会では、セールス・オーダー・ヘッダー・テーブルのすべての列と、セールス・オーダー行のすべての列を要求しています。WHERE 節は、データを共通のセールス・オーダー番号と突き合わせるよう指示しています。つまり、結果セットの任意の行のヘッダー情報は、同じセールス・オーダーの 1 行に当てはまります。
この構文には欠点があり、そのうち最も大きな欠点と思われるものは、不一致のオーダーが削除されていることです。つまり、ヘッダーはあるが行がないオーダー、あるいは 1 つまたは複数の行はあるがヘッダーがないオーダーは、結果セットには表示されません。DBMS プロバイダーは、外部結合をサポートするために拡張機能を考え出す必要がありました。
私の場合、利点がないのでこの構文は使いません。見たときに理解できるよう、皆さんはこの構文を知っている方が良いと思いますが、使うことはお勧めしません。
方法2:JOIN...USING
これは自然結合を実装したものです。自然結合については、同じデータ型の共通フィールド名で 2 つのテーブル/ビューが結合しているということを、まず最初に知っておく必要があります。
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 つ返すのでしょうか? 理解できないようなものを見てみたくありませんか? これを見てください。
結果セットは以下のようになります。
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 の例を挙げます。
そして、結果セットは以下のようになります。
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 と一致しています。
これこそ、私が使っていてお勧めできる構文です。