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

第6章 いろいろなデータ操作の方法> 6.1 表をグループ化してデータを操作する

6.1.3 関連づけられた複数の表をグループ化して操作する

FROM句に複数の表を指定することにより、表を関連づけて操作できることはすでに説明しました。表式の中では、FROM句の結果は表を導出します。その表から処理対象の行を特定するWHERE句の結果も表を導出します。GROUP BY句はこの表を対象に処理します。したがって、複数の表を関連づけた結果をグループ化して操作することができます。指定例を以下に示します。

例1

在庫表と発注表から、製品番号と在庫数量ごとに、発注数量の合計が210未満でかつ複数の取引先に発注している製品について、製品番号と、在庫数量に発注数量の合計を加えた値を求めます。
SELECT 製品番号, 在庫数量 + SUM(発注数量)

       FROM 在庫管理.発注表, 在庫管理.在庫表
                      (1)
       WHERE 取引製品 = 製品番号
                  (1)
       GROUP BY 製品番号, 在庫数量
                   (1)
       HAVING SUM(発注数量) < 210 AND COUNT(取引先) >= 2 
                      (1)

(1) 表式

[図:関連づけられた複数の表をグループ化して操作する例]

注1) この例のFROM句およびWHERE句の結果の導出方法は“図:複数の表を関連づけて操作する例”で説明しています。

注2) 演算式の結果の列には名前がありません。

このデータ操作で、誤りやすい例を以下に示します。データ操作が、製品番号ごとに、在庫数量と発注数量の合計を求めることから、以下のように指定しても同じと誤解すると誤りになります。

 

例2

例1のデータ操作を誤って指定した例です。
SELECT 製品番号, SUM(在庫数量) + SUM(発注数量)

              :

       GROUP BY 製品番号

この問合せ指定を実行すると、結果は以下のようになります。

[図:関連づけられた複数の表をグループ化したときに誤りやすい例]

注) 演算式の結果の列には名前がありません。

上記の誤りを修正するために、MAX関数またはMIN関数を使用することは可能です。この例を以下に示します。

 

例3

例2の誤りを修正した例です。
SELECT 製品番号, MAX(在庫数量) + SUM(発注数量)

          :

       GROUP BY 製品番号

          :

在庫数量は、それぞれのグループごとに同じ値を複数持つため、それらの最大値または最小値はその値になり、この問合せ指定の結果は、“図:関連づけられた複数の表をグループ化して操作する例”と同じになります。しかし、SQL文の処理効率をよくするには、例1のように指定してください。


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

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