14

テーブルに挿入しようとしていますが、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と、期待どおりに動作します。しかし、私はそれを注文する必要があります。どうすれば修正できますか?

4

3 に答える 3

23

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

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
       ;
于 2012-02-07T14:06:20.930 に答える
1

キーワードを使用する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
;
于 2012-02-07T11:59:56.507 に答える
0

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

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

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

INSERT INTO MY_TABLE (
SELECT * FROM (
    SELECT columns
    FROM table
    ORDER BY clause
    )
)
于 2014-09-04T14:49:59.853 に答える