Вставка с множественным выбором

У меня есть запрос 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 было уникальным, поэтому ему нужно каждый раз извлекать самый большой идентификатор, а не только перед вставкой, но каждый раз, когда новый строка вставляется.


person vdolez    schedule 02.06.2015    source источник
comment
Это второй подвыбор, который возвращает более одной строки. Вместо этого вставьте ... выберите.   -  person jarlh    schedule 02.06.2015


Ответы (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;

Чтобы ответить на ваш комментарий к сообщению 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 также поддерживает ROW_NUMBER стандартного SQL, и он также должен работать как есть.

person dnoeth    schedule 02.06.2015
comment
Спасибо за редактирование, у меня могут возникнуть проблемы с пониманием ключевого мира OVER. Во всяком случае, я попытался и получил идентификатор не уникальной ошибки. Есть ли способ получить значение при выполнении? - person vdolez; 02.06.2015
comment
Ладно, твой метод был хорошей тропой для следования. Использование ключевого слова rownumber вместо funciton сработало отлично! - person vdolez; 02.06.2015
comment
Если вы замените ROW_NUMBER() OVER (ORDER BY, что вам нужно) на rownum, я приму ваш ответ :) - person vdolez; 02.06.2015
comment
@Vdolez: переключился на ROWNUM, но синтаксис ROW_NUMBER тоже должен работать (вы должны были сделать что-то еще, если это не удалось...) - person dnoeth; 02.06.2015
comment
Возможно ли, что функция выполняется только перед лечением, тогда как ключевой мир соответствует количеству вхождений во время лечения? - person vdolez; 02.06.2015
comment
@Vdolez: Когда вы запустите SELECT без INSERT, вы увидите фактические данные. Предполагая, что это не фактический запрос, что-то еще может вызвать эту ошибку. - person dnoeth; 02.06.2015

Вы можете преобразовать эти два запроса в один, соединив запрос из 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
person Mureinik    schedule 02.06.2015
comment
Извините, я не пробовал. Я чувствовал, что есть «более простое» решение. Спасибо - person vdolez; 02.06.2015

Вместо этого выполните INSERT с SELECT:

INSERT INTO my_table (value0, value1, value2, value3)
    SELECT DISTINCT (SELECT MAX(value0) FROM some_table), 5, value2, 8
    FROM another_table
person jarlh    schedule 02.06.2015
comment
Что делать, если some_table = my_table и value0 нужно увеличивать каждый раз, когда вставляется значение? - person vdolez; 02.06.2015
comment
Итак, моя_таблица = некоторая_таблица. Value0 является идентификатором и должен быть уникальным. Каждый раз, когда значение вставляется в my_table, мне нужно обновить SELECT MAX(value0). - person vdolez; 02.06.2015