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

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

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 из этого, он будет работать так, как ожидалось. Но мне нужно заказать его. Просьба уточнить.

Спасибо заранее.

Ответ 1

Оба текущих ответа игнорируют тот факт, что использование 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
       ;

Ответ 2

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

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
;

Ответ 3

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

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

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

INSERT INTO MY_TABLE (
SELECT * FROM (
    SELECT columns
    FROM table
    ORDER BY clause
    )
)