ORA-00907 Отсутствует правильная проблема с круглыми скобками - выберите с заказом внутри запроса вставки - PullRequest
12 голосов
/ 07 февраля 2012

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

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 ]

22 голосов
/ 07 февраля 2012

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

Вы не используете 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
;
0 голосов
/ 04 сентября 2014

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

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

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

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