запрос работает на oracle 12c, но не работает на 11g - PullRequest
0 голосов
/ 09 июня 2018

У меня есть простой (но не очень умный) код в SQL (оракул).Этот SQL работает корректно на версии oracle 12c, но есть исключение на версии oracle v. 11g.Можете ли вы дать мне ответ, почему?



    create table app_status (id_status int, description varchar2(20 char), range_char char(1));
    /
    create table app (id_app int,  description varchar2(20 char), range_char char(1));
    /
    insert into app_status (id_status, description,range_char) values (1,'opis 1','a');
    insert into app_status (id_status, description,range_char) values (2, 'opis 2','b');
    insert into app_status (id_status, description,range_char) values (3, 'opis 3','a');
    insert into app_status (id_status, description,range_char) values (4, 'opis 4','a');
    /
    insert into app (id_app,description,range_char) values (1,'app 1','a');
    insert into app (id_app,description,range_char) values (2,'app 2','a');
    insert into app (id_app,description,range_char) values (3,'app 3','a');
    insert into app (id_app,description,range_char) values (4,'app 4','b');
    insert into app (id_app,description,range_char) values (5,'app 5','a');
    insert into app (id_app,description,range_char) values (6,'app 6','a');
    insert into app (id_app,description,range_char) values (7,'app 7','c');
    insert into app (id_app,description,range_char) values (8,'app 8','a');
    insert into app (id_app,description,range_char) values (9,'app 9','a');
    /


    -- this query does not work on oracle v.11g
    select * from app where not exists (
           select id_status from (
                  select id_STATUS FROM APP_STATUS 
                  WHERE APP_STATUS.RANGE_CHAR = APP.RANGE_CHAR 
                  ORDER BY ID_STATUS DESC 
           ) WHERE ROWNUM=1);

Я не смог найти информацию в спецификации oracle 11g, почему она не работает.Может быть, это не правильно на 12c, но более высокая версия терпит неровности?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Добро пожаловать на ТАК!

Я могу воспроизвести ваше исключение на 11g:

SELECT * 
  FROM app
 WHERE NOT EXISTS ( 
                   SELECT id_status 
                     FROM (
                           SELECT id_status 
                             FROM app_status 
                            WHERE app_status.range_char = app.range_char 
                            ORDER BY id_status DESC
                           ) 
                     WHERE ROWNUM=1
                   );
Version 11.2.0.2 ORA-00904: "APP"."RANGE_CHAR": invalid identifier
Version 12.2.0.1 OK

Я согласен с @krokodilko, запрос может и должен быть упрощен, например, до

SELECT * 
  FROM app 
 WHERE NOT EXISTS ( 
                   SELECT * 
                     FROM app_status 
                    WHERE app_status.range_char = app.range_char 
                   );

, чтозатем работает в 11.2 и 12.2, я все еще озадачен, почему это рассматривается как ошибка в 11.2.

Кто-нибудь знает подробности?

0 голосов
/ 09 июня 2018

Просто закомментируйте один подзапрос и удалите ORDER BY:

 select * from app where not exists (
  --         select id_status from (
                  select id_STATUS FROM APP_STATUS 
                  WHERE APP_STATUS.RANGE_CHAR = APP.RANGE_CHAR 
  --                ORDER BY ID_STATUS DESC 
 --          ) WHERE ROWNUM=1
 );

или просто удалите их:

     select * from app where not exists (
                      select id_STATUS FROM APP_STATUS 
                      WHERE APP_STATUS.RANGE_CHAR = APP.RANGE_CHAR 
     );

этот подзапрос не нужен в операторе NOT EXISTS, этот оператор проверяетНезависимо от того, существует строка или нет, нет необходимости отфильтровывать только 1 запись или заказывать повторный набор.

Кстати, если вы удалите этот подзапрос и ORDER BY, то весь запрос, вероятно, будет быстрее, покадает точно такие же результаты.

...