テーブルに挿入しようとしていますが、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
を削除すると、期待どおりに動作します。しかし、私はそれを注文する必要があります。どうすれば修正できますか?
現在の回答はどちらも、同じクエリでorder by
とrownum
を使用することは本質的に危険であるという事実を無視しています。必要なデータが得られるという保証はまったくありません。順序付けられたクエリの最初の行が必要な場合は、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
;
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
;
データを挿入するときではなく、データを抽出するときに順序付けを実行する必要があることに同意します。
ただし、回避策として、SELECT全体を別のSELECTにカプセル化するINSERTからORDERBY句を分離することができます。
これにより、エラーが回避されます。
INSERT INTO MY_TABLE (
SELECT * FROM (
SELECT columns
FROM table
ORDER BY clause
)
)