ORA-00907 Отсутствует правильная скобка - выберите с заказом внутри запроса вставки

Я пытаюсь сделать вставку в таблицу, и он использует один оператор выбора для одного столбца. Ниже приведена иллюстрация моего запроса.

INSERT INTO MY_TBL (MY_COL1, MY_COL2)
VALUES (
(SELECT DATA FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC),
1 
);

Это бросает ORA-00907 Missing right Parenthesis, Если я удалю ORDER BY Исходя из этого, он работает как ожидалось. Но мне нужно заказать это. Просьба уточнить.

Заранее спасибо.

3 ответа

Решение

Оба текущих ответа игнорируют тот факт, что с помощью order by а также rownum в том же запросе по сути своей опасно. Нет абсолютно никаких гарантий, что вы получите те данные, которые хотите. Если вы хотите первую строку из упорядоченного запроса, вы должны использовать подзапрос:

insert into my_tbl ( col1, col2 )
select data, 'more data'
  from ( select data
           from fir_tabl
          where id = 1
          order by created_on desc )
 where rownum = 1
       ;

Вы также можете использовать такую ​​функцию, как rank упорядочить данные в нужном вам методе, хотя, если у вас было два created_on даты, которые были идентичны, вы получите 2 значения с rnk = 1,

insert into my_tbl ( col1, col2 )
select data, 'more data'
  from ( select data
              , rank() over ( order by created_on desc ) as rnk
           from fir_tabl
          where id = 1)
 where rnk = 1
       ;

Вы не используете SELECT при использовании VALUES ключевое слово. Используйте это вместо:

INSERT INTO MY_TBL (MY_COL)
SELECT DATA FROM FIR_TABL WHERE ID = 1 ORDER BY CREATED_ON DESC
;

Ваш отредактированный запрос будет выглядеть так:

INSERT INTO MY_TBL (MY_COL1, MY_COL2)
SELECT DATA, 1 FROM FIR_TABL WHERE ID = 1 AND ROWNUM = 1 ORDER BY CREATED_ON DESC
;

Я согласен, что упорядочение должно выполняться при извлечении данных, а не при их вставке.

Однако в качестве обходного пути вы можете изолировать предложение ORDER BY от INSERT, инкапсулируя весь ваш SELECT в другой SELECT.

Это позволит избежать ошибки:

INSERT INTO MY_TABLE (
SELECT * FROM (
    SELECT columns
    FROM table
    ORDER BY clause
    )
)
Другие вопросы по тегам