查询在oracle 12c上工作,但在11g上不工作

查询在oracle 12c上工作,但在11g上不工作,oracle,oracle11g,oracle12c,Oracle,Oracle11g,Oracle12c,我在sql oracle中有简单但不太智能的代码。 此SQL在oracle版本12c上正常工作,但在oracle v上有例外。11克。你能告诉我为什么吗 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), ran

我在sql oracle中有简单但不太智能的代码。 此SQL在oracle版本12c上正常工作,但在oracle v上有例外。11克。你能告诉我为什么吗



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


我在Oracle11g规范中找不到信息,为什么它不起作用呢。在12c上可能不正确,但更高版本可以容忍不规则

只需注释掉一个子查询并通过以下方式删除订单:

 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条记录或订购重新设置。 顺便说一下,如果删除此子查询并按顺序排序,则整个查询可能会更快,同时给出完全相同的结果。

欢迎使用

我可以在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中被视为错误


有人知道详细信息吗?

Oracle 11g中的例外情况是什么?从不存在的应用程序中选择*从存在的应用程序中选择id\U状态从存在的应用程序中选择id\U状态从存在的应用程序中选择id\U状态从应用程序状态中选择id\U状态从应用程序状态中选择app.RANGE\U字符按id\U状态描述排序,其中ROWNUM=1命令行错误:23列:123错误报告-SQL错误:ORA-00904:app.RANGE\U字符:无效标识符00904。00000-%s:无效标识符*原因:*操作:是,我知道。这不是我的查询,我只是想在oracle v.11g上迁移应用程序,而不修改由hibernate生成查询的源代码。好的,显示您的hibernate代码和实体映射。不幸的是,如果不更改源代码,您将无法从Oracle 12c迁移到11g,这是不可能的。12c删除了嵌套相关子查询的一些限制。但是我在文档中找不到它。相关:谢谢!感谢您,我在文档中发现了不同的内容。我很荣幸向你学习。