首页 > 解决方案 > Oracle 8i - 无法从子查询中引用外部表

问题描述

我在 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”的值

方法

  1. 过滤 D.NCR_KEY 和 D.DISCREPANCY_NUMBER
  2. 子查询还旨在过滤这些相同的数字并提取指定 NCR_KEY 的所有 3 个值
  3. 按 SEQUENCE_NUMBER 降序排列的子查询订单
  4. 外层查询只选择前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

标签: sqloracleoracle8i

解决方案


甲骨文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。


推荐阅读