Symfoware(R) Server SQLビギナーズガイド - FUJITSU - |
目次
索引
![]() ![]() |
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のように指定してください。
目次
索引
![]() ![]() |