14

我正在尝试插入表,它对一列使用一个选择语句。下面是我的查询的插图。

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,它会按预期工作。但我需要订购它。我该如何解决?

4

3 回答 3

23

当前的两个答案都忽略了这样一个事实,即在同一查询中使用order byandrownum本质上是危险的。绝对不能保证你会得到你想要的数据。如果您想要有序查询的第一行,则必须使用子查询:

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 个带有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
       ;
于 2012-02-07T14:06:20.930 回答
1

使用关键字SELECT时不要使用 a 。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
;
于 2012-02-07T11:59:56.507 回答
0

我同意在提取数据时而不是在插入数据时进行排序。

但是,作为一种解决方法,您可以将 ORDER BY 子句与 INSERT 隔离,将整个 SELECT 封装到另一个 SELECT 中。

这将避免错误:

INSERT INTO MY_TABLE (
SELECT * FROM (
    SELECT columns
    FROM table
    ORDER BY clause
    )
)
于 2014-09-04T14:49:59.853 回答