ORA-00907缺少右括号问题 - 通过内部插入查询选择顺序

时间:2012-02-07 11:50:57

标签: sql oracle ora-00907

我正在尝试对表进行插入,并且对一列使用一个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,它会按预期工作。但我需要订购它。请澄清。

提前致谢。

3 个答案:

答案 0 :(得分:22)

当前的答案都忽略了在同一查询中使用order byrownum本身就很危险的事实。绝对不能保证您将获得所需的数据。如果您想要有序查询的第一行,必须使用子查询:

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
    )
)