日足チャート始めました

セミFIREしたいSIer勤め30代SE。お得情報、技術、ゲームアニメ関連情報などを発信。

ORACLE)複数テーブル結合でないのに、FETCH FIRST n ROWS ONLYを使っていると「ORA-00918 :定義が未確定です」エラーが発生する件

ラクルのSQL文を作っている時に、「ORA-00918 :定義が未確定です」エラーが発生しました。このエラーがでる原因として、通常は「同じ項目名を持つ複数テーブルを結合しているが、SELECT項目の中にどちらのテーブルを使うか指定がない場合」に発生するかと思います。

しかし今回のエラーではテーブル結合は行っておらず、当初原因がわかりませんでした。原因、解決方法について備忘も兼ねて残しておきます。

 

■遭遇したエラーの発生条件

今回遭遇したエラーの発生条件は以下を満たすケースです。

  1. FETCH FIRST n ROWS ONLY構文を使っている
  2. SELECTする項目に同じ名前のものが2個以上含まれる場合に発生する。

    (取得するテーブルが単数、複数に限らず発生する)

     

■今回ケースのSQL例

テーブルX→テーブルYにデータをINSERT SELECT をしたかったのですが、セットする列のうち2列についてはnullをセットしたく、以下の通り記載しました。このnullが同じ名前の項目として扱われているようです。

INSERT INTO
    tableX
SELECT
    列A
    ,null
    ,null
FROM
    tableY
FETCH FIRST 10 ROWS ONLY

  

■解消方法

SELECTして取得する項目に別名をつけることで解決できました。

INSERT INTO
    tableX
SELECT
    列A
    ,null as "列B"
    ,null as "列C"
FROM
    tableY
FETCH FIRST 10 ROWS ONLY

 

■参考情報

これはバグではなく、制限事項としてオラクルの公式文書にも記載があります。

https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#BABHFGAA

  • If the select list contains columns with identical names and you specify the row_limiting_clause, then an ORA-00918 error occurs. This error occurs whether the identically named columns are in the same table or in different tables. You can work around this issue by specifying unique column aliases for the identically named columns.

 

■おわりに

あまりお目にかかるパターンではないかもしれませんが、日本語での情報がなかなか見つからなかったので記事にしていました。誰かの参考になりますように。

お読みいただきありがとうございました!お疲れ様です。