Вставить с несколькими вариантами выбора

У меня есть запрос 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
Другие вопросы по тегам