SQL(Oracle)ハマりポイント
SQL(Oracle)ハマりポイント
きっかけ
自分の備忘録や学習記録として、また読んだ方が同じ失敗で困らないようにとの思いから、このページを書き始めました。
業務システムでは現在でもOracleが広く利用されており、私もOracleを扱う機会を得られたため、本記事ではOracleを題材にSQLを解説します。
ORA-01791
not a SELECTed expression
これは主に SELECT DISTINCT と ORDER BY の組み合わせで発生します。
SELECT DISTINCT
ITEM_CODE
FROM
ITEM_LIST
ORDER BY
ITEM_NAME;
SELECT句でITEM_CODEを指定してますが、ORDER BY句でITEM_NAMEを指定しているためエラーとなります。DISTINCTを外すと、エラーは発生しません。
事例
SELECT DISTINCT
I.ITEM_CODE,
V.ITEM_VALUE
FROM
ITEM_LIST I
INNER JOIN VALUE_LIST V
ON I.ITEM_CODE = V.ITEM_CODE
ORDER BY
V.ITEM_CODE
私の場合はINNER JOINしていたため見落としていました。
結合条件によって実質的に同じ値になる列でしたが、Oracleは値の一致ではなく、SELECT句に含まれているかどうかで判定するためエラーとなります。
解説
DISTINCTで重複排除を行った後、どのITEM_NAMEで並び替えるべきか決められないケースが存在するため、この制約があります。そのため、ORDER BYで指定する列も、SELECT句に含まれていなければなりません。
今回の例では V.ITEM_CODE がSELECT句に存在しないため、Oracleはどの値を基準に並び替えればよいのか判断できず、ORA-01791が発生しました。
まとめ
生成AIが誰でも気軽に使える時代になりました。タイプミスだろうが、コンマの過不足でもコードをAIに投げたら、瞬時に間違いを見つけて修正案を提案してくれます。
しかし、AIの回答を正しく判断するためにも、自分自身でエラーの原因を理解することは重要です。そのため、自分の備忘録も兼ねて、今後も遭遇したエラーやハマりポイントを記録していきたいと思います。
Discussion