sql - 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”的值
方法
- 过滤 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
解决方案
甲骨文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。
推荐阅读
- python - 神经网络不收敛于明确的线性可分问题
- analysis - 分析平面图的最佳 Grasshopper 插件
- azure - 日志流选项卡在 Azure 函数中不起作用
- c++ - GCC8.2如何启用警告:数组下标高于数组边界[-Warray-bounds]
- types - 在 stm32 中移植一些 arduino 代码:word 数据类型的问题
- python - Python3 - 代码停止工作并显示名称错误
- node.js - 问题模拟 Axios 后调用的返回值以进行单元测试
- javascript - 在 jquery.dataTable 中同时键入两个字段
- sql - T-SQL - 查询 2 个表之间的不同匹配
- amazon-web-services - AWS S3 存储桶策略不适用于从前端 Javascript 放置文件