oracle - 查询适用于 oracle 12c 但不适用于 11g

标签 oracle oracle11g oracle12c

我在sql(oracle)中有简单(但不是那么聪明)的代码。 此 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 上不正确,但更高版本可以容忍不规则性?

最佳答案

欢迎来到SO!

我可以在 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 - 查询适用于 oracle 12c 但不适用于 11g,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50773259/

相关文章:

mysql - Oracle 替换函数

oracle11g - 动态旋转

java - 语句在数据库中有效,但在 Java 代码中失败 -

java - Oracle 默认按行为排序

java - 是否有从 oracle 结果集中检索二进制 XML 的函数

json - 在 oracle 12c 中以 JSON 形式返回 sql 查询的结果

oracle - COMMIT 和 ROLLBACK 的时间会影响性能吗?

sql - DELETE QUERY 第一次运行缓慢,但第二次(对于相同条件)运行速度很快 - 如何在第一次运行时使查询快速运行?

sql - "local collection types not allowed"PL/SQL 错误 ORA-06550

oracle - 如何使用Oracle的LISTAGG函数和独特的过滤器?