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
)
)