多选插入
Insert with multiple selects
我有一个 SQL 请求 return 一些 ora-01427 错误:
single-row subquery returns more than one row
INSERT INTO my_table (value0, value1, value2, value3)
VALUES((SELECT MAX(value0) FROM my_table), '5', (SELECT DISTINCT(value2) FROM another_table), '8');
问题是,我需要两个硬编码值,我需要 select 中的一个值 return 只有一行,我想对每一行都这样做 return秒 select.
我觉得如果我只有一个 select,这个查询就会有效。有没有办法在 INSERT 中执行多个 SELECT ?语法是什么?
编辑:my_table 和 some_table 实际上是相同的 table,抱歉一开始不清楚,实际上,我需要 value0 是唯一的,所以它需要每次都检索最大的 id,不仅仅是在插入之前,而是每次插入新行时。
您需要切换到 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 的 post 的评论:“如果每次插入值时 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,它也应该按原样工作。
您可以通过将 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
改为使用 SELECT 插入:
INSERT INTO my_table (value0, value1, value2, value3)
SELECT DISTINCT (SELECT MAX(value0) FROM some_table), 5, value2, 8
FROM another_table
我有一个 SQL 请求 return 一些 ora-01427 错误:
single-row subquery returns more than one row
INSERT INTO my_table (value0, value1, value2, value3)
VALUES((SELECT MAX(value0) FROM my_table), '5', (SELECT DISTINCT(value2) FROM another_table), '8');
问题是,我需要两个硬编码值,我需要 select 中的一个值 return 只有一行,我想对每一行都这样做 return秒 select.
我觉得如果我只有一个 select,这个查询就会有效。有没有办法在 INSERT 中执行多个 SELECT ?语法是什么?
编辑:my_table 和 some_table 实际上是相同的 table,抱歉一开始不清楚,实际上,我需要 value0 是唯一的,所以它需要每次都检索最大的 id,不仅仅是在插入之前,而是每次插入新行时。
您需要切换到 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 的 post 的评论:“如果每次插入值时 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,它也应该按原样工作。
您可以通过将 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
改为使用 SELECT 插入:
INSERT INTO my_table (value0, value1, value2, value3)
SELECT DISTINCT (SELECT MAX(value0) FROM some_table), 5, value2, 8
FROM another_table