ページの先頭行へ戻る
Symfoware Server V10.0.0 アプリケーション開発ガイド(共通編)

9.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) 表式

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

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

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


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


2

例1のデータ操作を誤って指定した例です。

SELECT 製品番号, SUM(在庫数量) + SUM(発注数量)

              :

       GROUP BY 製品番号

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

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

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


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


3

例2の誤りを修正した例です。

SELECT 製品番号, MAX(在庫数量) + SUM(発注数量)

          :

       GROUP BY 製品番号

          :

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