Вставить с несколькими вариантами выбора
У меня есть запрос 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? Какой будет синтаксис?
РЕДАКТИРОВАТЬ: my_table и some_table на самом деле одна и та же таблица, извините за непонятность, во-первых, мне нужно, чтобы значение0 было уникальным, поэтому необходимо каждый раз получать самый большой идентификатор, не только перед вставкой, но каждый раз, когда новый строка вставлена.
3 ответа
Вам нужно переключиться на INSERT/SELECT:
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 нужно увеличивать при каждом добавлении значения?"
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 также поддерживает ROW_NUMBER стандартного SQL, и он должен работать как есть.
Вы можете преобразовать эти два запроса в один, перекрестным соединением запроса из 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
Вместо этого сделайте INSERT с помощью SELECT:
INSERT INTO my_table (value0, value1, value2, value3)
SELECT DISTINCT (SELECT MAX(value0) FROM some_table), 5, value2, 8
FROM another_table