2015-06-02 8 views
3

у меня есть запрос SQL, которые возвращают некоторые 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 внутри INSERT? Какой будет синтаксис?

EDIT: my_table и some_table на самом деле одна и та же таблица, извините за то, что она не была ясна в первую очередь, на самом деле мне нужно, чтобы value0 был уникальным, поэтому каждый раз нужно получать самый большой идентификатор, а не только перед вставкой, но каждый раз, когда вставлена ​​новая строка.

+1

Это второй суб-выбор, который возвращает более чем одна строка. Вставьте ... выберите вместо этого. – jarlh

ответ

4

Вам нужно переключиться на 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 

Edit:

я перешел на ROWNUM, но это собственный синтаксис. Oracle также поддерживает ROW_NUMBER Standard SQL и он должен работать как есть.

+0

Спасибо за редактирование, возможно, у меня проблемы с пониманием ключевого мира OVER. В любом случае, я попытался получить идентификатор, а не уникальную ошибку. Есть ли способ получить значение при исполнении? – vdolez

+0

Хорошо, ваш метод был хорошим следом. Использование ключевого слова rownumber вместо funciton отлично работало! – vdolez

+0

Если вы замените «ROW_NUMBER() OVER (ORDER BY what you need)» на «rownum», я отвечу на ваш ответ :) – vdolez

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 
+0

Извините, я не пробовал. Я чувствовал, что есть «более легкое» решение. Спасибо – vdolez

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 
+0

Что делать, если some_table = my_table и value0 нужно увеличивать каждый раз при вставке значения? – vdolez

+0

Можно сделать, но вы должны описать детали. – jarlh

+0

Итак, my_table = some_table. Значение0 является идентификатором и должно быть уникальным. Каждый раз, когда значение вставляется в my_table, мне нужно изменить значение SELECT MAX (value0). – vdolez

 Смежные вопросы

  • Нет связанных вопросов^_^