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,它将按预期工作。但我需要订购。我该怎么修?

当前的两个答案都忽略了在同一查询中使用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日期,则最终会得到两个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
    )
)

相关内容

  • 没有找到相关文章

最新更新