web-dev-qa-db-ja.com

ORA-00907右括弧の問題がありません-挿入クエリ内で順序を指定して選択してください

テーブルに挿入しようとしていますが、1つの列に1つのselectステートメントを使用しています。以下は私のクエリの図です。

INSERT INTO MY_TBL (MY_COL1, MY_COL2)
VALUES (
(SELECT DATA FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC),
1
);

ORA-00907 Missing right Parenthesisをスローします。これからORDER BYを削除すると、期待どおりに動作します。しかし、私はそれを注文する必要があります。どうすれば修正できますか?

13
Vaandu

現在の回答はどちらも、同じクエリでorder byrownumを使用することは本質的に危険であるという事実を無視しています。必要なデータが得られるという保証はまったくありません。順序付けられたクエリの最初の行が必要な場合は、mustサブクエリを使用します。

insert into my_tbl ( col1, col2 )
select data, 'more data'
  from ( select data
           from fir_tabl
          where id = 1
          order by created_on desc )
 where rownum = 1
       ;

rank のような関数を使用して、必要なメソッドでデータを並べ替えることもできますが、同じcreated_onの日付が2つある場合は、2になります。 rnk = 1の値。

insert into my_tbl ( col1, col2 )
select data, 'more data'
  from ( select data
              , rank() over ( order by created_on desc ) as rnk
           from fir_tabl
          where id = 1)
 where rnk = 1
       ;
22
Ben

SELECTキーワードを使用する場合は、VALUESを使用しません。代わりにこれを使用してください:

INSERT INTO MY_TBL (MY_COL)
SELECT DATA FROM FIR_TABL WHERE ID = 1 ORDER BY CREATED_ON DESC
;

編集したクエリは次のようになります。

INSERT INTO MY_TBL (MY_COL1, MY_COL2)
SELECT DATA, 1 FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC
;
1
John Doyle

データを挿入するときではなく、データを抽出するときに順序付けを実行する必要があることに同意します。

ただし、回避策として、SELECT全体を別のSELECTにカプセル化するINSERTからORDERBY句を分離することができます。

これにより、エラーが回避されます。

INSERT INTO MY_TABLE (
SELECT * FROM (
    SELECT columns
    FROM table
    ORDER BY clause
    )
)
0