目次
発生しやすいエラー②
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 ‘%まんじゅう%’);
結果は以下のとおりとなります。
発生しやすいエラー及び、エラーに対しての対処方法の説明は以上となります。
コメントを残す