我正在尝试对表进行插入,并且对一列使用一个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
,它会按预期工作。但我需要订购它。请澄清。
提前致谢。
答案 0 :(得分:22)
当前的答案都忽略了在同一查询中使用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个{{1}的值}}
rnk = 1
答案 1 :(得分: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
;
答案 2 :(得分:0)
我同意在提取数据时应该执行排序,而不是在插入数据时执行。
但是,作为一种解决方法,您可以将INSDER中的ORDER BY子句与将整个SELECT封装到另一个SELECT中。
这样可以避免错误:
INSERT INTO MY_TABLE (
SELECT * FROM (
SELECT columns
FROM table
ORDER BY clause
)
)