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