Symfoware Server SQLビギナーズガイド - FUJITSU -
目次 索引 前ページ次ページ

第5章 複数の表を関連づけて操作する方法

5.2 表を関連づける条件を指定する

FROM句に複数の表を指定して導出される拡張直積は、それぞれの表のすべての行を組み合わせたにすぎません。アプリケーションの処理では、拡張直積の結果のほとんどの行が無意味なデータの集まりになってしまいます。アプリケーションでは、拡張直積の結果からすべての行を取り出して、必要な行だけを処理することは可能ですが、多くの行を取り出すために処理効率が悪くなります。そこで、表を関連づけるうえで意味のあるデータだけを絞り込むことが必要になります。それには、表式のWHEREに表を関連づけるための条件を指定します。指定例を以下に示します。

例1

図:FROM句に2つの表名を指定した場合に導出される表”の例でTBL1とTBL2の2つの表を関連づけるデータが、列COLAと列COLZの値とした場合の例です。
SELECT  …  FROM SCM.TBL1, SCM.TBL2  WHERE COLA = COLZ

[図:WHERE句に表を関連づけるための条件を指定した例]

例1では、列COLAと列COLZの値が同じ行を取り出すために、WHERE句に“COLA = COLZ”の条件を指定しています。

なお、FROM句に複数の表を指定した場合、これらの表の中で同じ名前の列が存在することがあります。そのような列を指定するには、列名を表名とピリオド(.)で修飾することが必要です。例えば、列名のCOLAが表TBL1と表TBL2の両方に存在する場合に、表TBL1の列COLAを指定するには、“TBL1.COLA”または“SCM.TBL1.COLA”と指定します。同様に、表TBL2の列COLAを指定するには、“TBL2.COLA”または“SCM.TBL2.COLA”と指定します。

 

複数の表を関連づける具体例として、本章の最初に述べた発注状況を調べる例を以下に示します。

例2

発注表と在庫表から、取引先、製品名、および発注数量を取り出します。この例では、列名には表名の修飾を付けて指定します。実際には、発注表と在庫表に同じ名前の列はないので、表名による修飾は指定しなくてもかまいません。なお、FROM句に指定する複数の表の間で同じ列名がある場合には、表名による修飾が必要です。
SELECT 発注表.取引先, 在庫表.製品名, 発注表.発注数量

       FROM 在庫管理.発注表, 在庫管理.在庫表

       WHERE 発注表.取引製品 = 在庫表.製品番号 

[図:複数の表を関連づけて操作する例]

■結合表

例2では、発注表あるいは在庫表に存在する行は、WHERE句で導出される表の中にすべて出現していました。しかし、条件によっては出現しない行もできてしまいます。条件を満たさない行も取り出したいような場合には、結合表を利用します。結合表は、結合型で指定した側の表中のうち、結合条件の探索条件を満たさない行も、存在すればすべて取り出すことができます。外結合にLEFTを記述した場合は結合型の左側の表の全行を取り出し、RIGHTを記述した場合は右側の表の全行を取り出します。指定例を以下に示します。

例3

会社表と日別発注表から、会社番号と取引先が等しいデータについて、会社名、取引製品、および発注数量を取り出します。このとき、会社番号と取引先が等しくない行でも日別発注表にある行はすべて取り出します。
SELECT 会社表.会社名, 日別発注表.取引製品, 日別発注表.発注数量

    FROM  会社表  RIGHT  OUTER  JOIN  日別発注表
            (1)    (A)    (2)            (1)
        ON  会社表.会社番号 = 日別発注表.取引先
        (B)                  (3)

(1) 表参照

(2) 外結合型

(A)〜(2) 結合型

(3) 探索条件

(B)〜(3) 結合条件

[図:結合表を利用して複数の表を関連づける例]

例3では、外結合型にRIGHTを記述した場合の例を示しましたが、同じ例文で外結合型にLEFTを記述した場合は以下のような結果になります。

  SELECT 会社表.会社名, 日別発注表.取引製品, 日別発注表.発注数量

      FROM  会社表  LEFT  OUTER  JOIN  日別発注表

            ON  会社表.会社番号 = 日別発注表.取引先


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 2007