【问题标题】:Insert with multiple selects多选插入
【发布时间】:2015-08-15 23:35:51
【问题描述】:

我有一个返回 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,不仅仅是在插入之前,而是每次插入新行的时间。

【问题讨论】:

  • 这是第二个返回多行的子选择。请插入 ... 选择。

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


【解决方案1】:

您需要切换到 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,它也应该按原样工作。

【讨论】:

  • 感谢编辑,我可能无法理解 OVER 键世界。无论如何,我尝试并得到一个 id not unique 错误。有没有办法在执行时获得价值?
  • 好吧,你的方法是一个很好的遵循。使用 rownumber 关键字而不是 funciton 效果很好!
  • 如果您将“ROW_NUMBER() OVER (ORDER BY any you need)”替换为“rownum”,我会接受您的回答 :)
  • @Vdolez: 切换到ROWNUM,但ROW_NUMBER 语法也应该可以工作(如果失败了,你必须做其他事情......)
  • @Vdolez:当您运行SELECT 而不使用INSERT 时,您将看到实际数据。假设这不是实际的查询,其他可能会导致此错误。
【解决方案2】:

您可以通过将来自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

【讨论】:

  • 对不起,我没有尝试。我觉得有一个“更简单”的解决方案。谢谢
【解决方案3】:

用 SELECT 代替 INSERT:

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

【讨论】:

  • 如果 some_table = my_table 和 value0 需要在每次插入值时递增?
  • 好的,所以 my_table = some_table。 Value0 是一个 ID,必须是唯一的。每次在 my_table 中插入一个值时,我都需要更新 SELECT MAX(value0)。
猜你喜欢
  • 1970-01-01
  • 2010-10-18
  • 2014-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2018-03-01
  • 2011-07-19
相关资源
最近更新 更多