插入多个选择

时间:2015-06-02 09:00:19

标签: sql oracle oracle-sqldeveloper sql-insert insert-select

我有一个SQL请求返回一些ora-01427错误:

  

单行子查询返回多行

INSERT INTO my_table (value0, value1, value2, value3) 
        VALUES((SELECT MAX(value0) FROM my_table), '5', (SELECT DISTINCT(value2) FROM another_table), '8');

问题是,我需要两个硬编码值,我需要一个只返回一行的select的值,我想对第二个选择返回的每一行执行此操作。

如果我只有一个选择,我觉得这个查询会起作用。有没有办法在INSERT中进行多个SELECT?语法是什么?

编辑:my_table和some_table实际上是同一个表,对不起首先不清楚,实际上,我需要value0是唯一的,所以它需要每次检索最大的id,而不是在插入之前,但每次插入新行的时间。

3 个答案:

答案 0 :(得分:4)

您需要切换到INSERT / SELECT:

INSERT INTO my_table (value0, value1, value2, value3) 
SELECT
   (SELECT MAX(value0) FROM my_table) 
     + ROWNUM -- ROW_NUMBER() OVER (ORDER BY whatever you need)
  ,'5'
  ,value2
  ,'8'
FROM
  (
    SELECT DISTINCT value2
    FROM another_table
  ) dt

回答你对jarlh帖子的评论:“如果some_table = my_table和value0需要在每次插入一个值时递增怎么办?

ROWNUM

编辑:

我切换到{{1}},但这是专有语法。 Oracle还支持标准SQL的ROW_NUMBER,它也应该按原样运行。

答案 1 :(得分:3)

您可以将some_table的查询与anoter_table的结果交叉加入,将这两个查询转换为单个查询。也可以选择硬编码文字。

此外,请注意,要插入select结果,您不需要values关键字:

INSERT INTO my_table (value0, value1, value2, value3) 
SELECT      DISTINCT max_value_0, '5', value2, '8'
FROM        another_table
CROSS JOIN  (SELECT MAX(value0) AS max_value_0
             FROM some_table) t

答案 2 :(得分:1)

改为使用SELECT INSERT:

INSERT INTO my_table (value0, value1, value2, value3)
    SELECT DISTINCT (SELECT MAX(value0) FROM some_table), 5, value2, 8
    FROM another_table