4

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

单行子查询返回多于一行

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

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

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

编辑: my_table 和 some_table 实际上是同一张表,很抱歉一开始不清楚,实际上,我需要 value0 是唯一的,所以它需要每次都检索最大的 id,不仅仅是在插入之前,而是每次新的行被插入。

4

3 回答 3

4

您需要切换到 INSERT/SELECT:

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

要回答您对 jarlh 帖子的评论:“如果每次插入值时 some_table = my_table 和 value0 都需要增加怎么办?

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

编辑:

我切换到ROWNUM,但这是专有语法。Oracle 还支持标准 SQL 的 ROW_NUMBER,它也应该按原样工作。

于 2015-06-02T09:03:51.767 回答
3

您可以通过将查询some_tableanoter_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
于 2015-06-02T09:04:15.237 回答
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
于 2015-06-02T09:04:47.230 回答