発生しやすいエラー②



発生しやすいエラー②

 

6.GROUP BY句にない列をSELECT句に指定した

地域表を使います。表のデータは以下のとおりです。

地域表

そして、以下のSQLを実行します。

SELECT 支店名, MAX(店舗面積), MIN(店舗面積)
FROM 地域
GROUP BY 地域;

結果は以下のとおりとなります。

地域で集約化しているのに支店名(最初のレコードの情報)が出力されました。このSQLはOracleではエラーになります。理由はGROUP BYで指定していない列(支店名)をSELECT句で指定しているからです。MySQLの結果もエラーにはなりませんでしたが、支店名とMAX、MIN関数の結果については矛盾しています。本来なら以下のSQLを実行するのであれば辻褄が合います。

SELECT 地域, MAX(店舗面積), MIN(店舗面積)
FROM 地域
GROUP BY 地域;

結果は以下のとおりとなります。

地域1~地域4のそれぞれの中での店舗面積の最大値、最小値を求めているので結果に対しても矛盾はありません。

7.表名の別名を記述しなかった

商品表と受注表を使います。データの内容は以下のとおりです。

商品表

受注表

以下のSQLを実行します。

SELECT 受注.受注日, 受注.得意名, 受注.商品コード, 商品.商品コード, 商品.商品名
FROM 受注 J,商品 S
WHERE 受注.商品コード = 商品.商品コード

結果は以下のとおりとなります。

エラーになった原因は単純です。FROM句で、受注表と商品表の別名をそれぞれ’J’、’S’で定義しているにも関わらず、この別名をSELECT句やWHERE句で使用していない為です。正しくは以下のとおりとなります。

SELECT J.受注日, J.得意先名, J.商品コード, S.商品コード, S.商品名
FROM 受注 J,商品 S
WHERE J.商品コード = J.商品コード

これなら、定義した別名と使用している別名が一致するのでエラーは発生しません。

8.あいまいな列名を指定した

ここでも、商品表と受注表を使用します。そして以下のSQLを実行します。

SELECT 受注日, 得意先名, 商品コード, 商品コード, 商品名
FROM 受注 ,商品
WHERE 商品コード = 商品コード

結果は以下のとおりとなります。

このエラーの原因は明白です。商品コードが曖昧とのメッセージが出ていますが、この商品コードは、受注表にも商品表にも存在するからです。どちらの表の商品コードか判別できない為、エラーとなっています。

9.サブクエリから複数の結果が返された

商品表と受注表を使います。以下のSQLを実行します。

SELECT * FROM 受注
WHERE 商品コード =
(SELECT 商品コード FROM 商品 WHERE 商品名 LIKE ‘%まんじゅう%’);

結果は以下のとおりとなります。

このSQLがエラーになった原因は、サブクエリの結果が2件返したことによります。サブクエリのSQLを実行してみます。

SELECT 商品コード FROM 商品 WHERE 商品名 LIKE ‘%まんじゅう%’

このSQLの結果は以下のとおりとなります。

本体のSQLは、サブクエリの結果が1件の前提で商品コードと比較しているのでエラーとなります。エラーとならないようにするには、サブクエリ側の結果が一意となるようなSQLを実行する必要があります。

10.サブクエリから複数の列が返された

商品表と受注表を使います。以下のSQLを実行します。

SELECT * FROM 受注
WHERE 商品コード =
(SELECT * FROM 商品 WHERE 商品名  = ‘ごままんじゅう’);

結果は以下のとおりとなります。

このSQLのエラーは、サブクエリのSELECT句が’*’で全項目返却されているため、本体のクエリは正しく比較することができない為エラーとなっています。正しくは以下のSQLを実行する必要があります。

SELECT * FROM 受注
WHERE 商品コード =
(SELECT 商品コード FROM 商品 WHERE 商品名 LIKE ‘%まんじゅう%’);

結果は以下のとおりとなります。

発生しやすいエラー及び、エラーに対しての対処方法の説明は以上となります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です