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 不支持 ANSIleft 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 中的删除/更新/插入子句
更新 oracle8i 数据库中我们无法使用正则表达式的记录