Oracle 8i - 无法从子查询中引用外部表

Posted

技术标签:

【中文标题】Oracle 8i - 无法从子查询中引用外部表【英文标题】:Oracle 8i - unable to reference outer table from subquery 【发布时间】:2021-08-17 19:16:44 【问题描述】:

我在 Oracle 8i dB 中有 3 个这样的表

表:NCM_HEADER@ncmsp H

NCR_KEY
 --------
 4412717
 4412718
 4412719 

表:NCM_DISCREPANCY@ncmsp D

 NCR_Key DISCREPANCY_NUMBER STATUS
 ---------------------------------
 4412717    1               'OPEN'
 4412717    2               'OPEN'
 4412718    1               'CLOSED'

表:NCM_SIGNOFF@ncmsp t

NCR_Key DISCREPANCY_NUMBER GROUP_NAME SEQUENCE_NUMBER
------------------------------------------------------
4412717    1                GROUP3      3
4412717    1                GROUP2      2
4412717    1                GROUP1      1
4412717    2                GROUP4      1
4412718    1                GROUP5      1

我正在寻找以下查询以返回“GROUP3”的值

方法

    过滤 D.NCR_KEY 和 D.DISCREPANCY_NUMBER 子查询还用于过滤这些相同的数字并提取指定 NCR_KEY 的所有 3 个值 按 SEQUENCE_NUMBER 降序排列的子查询顺序 外层查询只选择前1个

由于某种原因,它无法识别 D 表,并且在子查询中的 D.DISCREPANCY_NUMBER 和 D.NCY_KEY 上失败并显示错误消息:

“D”.“DISCREPANCY_NUMBER”:标识符无效

以下查询是更大查询的一部分。如何返回“GROUP3”?

SELECT
CASE WHEN D.DISCREPANCY_STATUS = 'OPEN' 
    THEN (SELECT *
            FROM (SELECT
                t.GROUP_NAME
                FROM NCM_SIGNOFF@ncmsp t
                WHERE t.NCR_KEY = D.NCR_KEY AND t.DISCREPANCY_NUMBER = D.DISCREPANCY_NUMBER --error point
                ORDER BY t.SEQUENCE_NUMBER DESC)
            WHERE ROWNUM = 1)
    ELSE NULL
    END AS "Current Group"
    
FROM NCM_HEADER@ncmsp H
LEFT JOIN NCM_DISCREPANCY@ncmsp D ON D.NCR_KEY = H.NCR_KEY
WHERE D.NCR_KEY = 4412717 AND D.DISCREPANCY_NUMBER = 1

【问题讨论】:

Oracle 8i 已经有 15 年没有得到支持了。您为什么使用不受支持的软件? 敏锐地意识到企业 IT 的主要挫折点。除了无休止地向他们抱怨迁移之外,我无能为力。 Oracle 8i 不支持 ANSI left outer join 语法。这直到 9i 才可用,所以我希望编译器首先反对。 【参考方案1】:

甲骨文 8i?哦,我的...无论如何,在我们可以将事物下推到多个嵌套级别之前的日子里,一个常见的技巧是使用 MAX 并将排序列 (SEQUENCE_NUMBER) 带入表达式以模拟排序的效果。

这样

SELECT
CASE WHEN D.DISCREPANCY_STATUS = 'OPEN' 
    THEN (SELECT substr(max(lpad(t.SEQUENCE_NUMBER,10,'0')||t.GROUP_NAME,11)
          FROM NCM_SIGNOFF@ncmsp t
          WHERE t.NCR_KEY = D.NCR_KEY AND t.DISCREPANCY_NUMBER = D.DISCREPANCY_NUMBER 
         )
    END AS "Current Group"
FROM NCM_HEADER@ncmsp H,
NCM_DISCREPANCY@ncmsp D 
WHERE D.NCR_KEY = 4412717 
AND D.DISCREPANCY_NUMBER = 1
AND D.NCR_KEY = H.NCR_KEY(+)

前 10 个字符是序列号,所以我们从 11 开始 SUBSTR 得到与这个最高序列号相关的组名的值。

但是考虑到从 8i 一直到 19c 的数据库版本中存在的安全补丁数量,与被黑客入侵和公司倒闭相比,让查询正常工作就显得微不足道了。也许这是您可以向您的 CIO 提出的一个论点,以摆脱 8i。

【讨论】:

以上是关于Oracle 8i - 无法从子查询中引用外部表的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql 转换成 hive sql -子查询转关联查询(十七),子查询中有2个表外字段关联写法,round函数与power函数的运用

Oracle - 如何从子查询中返回平均值?

从子查询中获取表名以在一行中用于 Oracle 中的删除/更新/插入子句

更新 oracle8i 数据库中我们无法使用正则表达式的记录

Oracle 8i 从具有相同 ID 但不同状态的多行数据集中选择查询

ORA-00933: 甲骨文 8i