我正试图插入到一个表中,它对一列使用一个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
本质上是危险的这一事实。绝对不能保证你会得到你想要的数据。如果您想要排序查询的第一行,则必须使用子查询:
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
日期,则最终会得到两个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
;
使用VALUES
关键字时不使用SELECT
。使用这个替代:
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
;
我同意在提取数据时执行排序,而不是在插入数据时执行。
但是,作为一种变通方法,您可以将ORDERBY子句与INSERT隔离开来,将整个SELECT封装到另一个SELECT中。
这将避免错误:
INSERT INTO MY_TABLE (
SELECT * FROM (
SELECT columns
FROM table
ORDER BY clause
)
)