💽

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