以下查询适用于 Windows 上的 Oracle 10.2.0.1.0,但不适用于 Linux 上的 Oracle 10.2.0.2.0。
错误报告: SQL 错误:ORA-00904:“T”。“AUDIT_USECS”:无效标识符 00904. 00000 - “%s:无效标识符”
它在我删除子查询后起作用。我发现如果在子查询中使用 T 的字段,则会发生错误。是说子查询不能访问主查询中的字段吗?
有什么问题?如何让它在 linux 上的 oracle 上运行? 谢谢!
CREATE TABLE AUDITHISTORY(
CASENUM numeric(20, 0) NOT NULL,
AUDIT_DATE date NOT NULL,
USER_NAME varchar(255) NULL,
AUDIT_USECS numeric(6, 0) NOT NULL,
TYPE_ID INT NOT NULL )
查询:
SELECT T.CASENUM,
T.USER_NAME,
T.AUDIT_DATE AS STARTED,
(SELECT *
FROM (SELECT S.AUDIT_DATE
FROM AUDITHISTORY S
WHERE S.CASENUM=T.CASENUM AND TYPE_ID=2
AND S.USER_NAME=T.USER_NAME
AND (S.AUDIT_DATE > T.AUDIT_DATE OR (S.AUDIT_DATE = T.AUDIT_DATE AND S.AUDIT_USECS > T.AUDIT_USECS))
ORDER BY S.AUDIT_DATE ASC,S.AUDIT_USECS ASC
) WHERE rownum <= 1) AS ENDED
FROM AUDITHISTORY T WHERE TYPE_ID=1
横幅
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
横幅
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod PL/SQL Release 10.2.0.2.0 - Production
CORE 10.2.0.2.0 Production
TNS for Linux: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production
最佳答案
我认为它在任何地方都有效令人惊讶。您在内联 View 中使用别名 T,但它仅在外部选择中定义。
在查看评论和其他答案中链接的所有信息后更新:
- 根据 Tom Kyte 的说法,它在一个/某些版本中实际工作的事实是该版本中的一个错误,这是此类信息的一个非常可靠的来源:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1853075500346799932#1859169400346361423
- 这里有两件事在起作用:
- 当使用子选择作为内联 View 时,您不能引用外部选择的任何内容。请参阅本文档的最后一个要点:http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/queries007.htm
- 在子选择的其他用途中(在 select 子句或 where 子句中),您可以从外部选择中引用内容,但只能从直接封闭的选择中引用。 (我个人认为这是一个愚蠢的限制,但我想 ANSI SQL 委员会中没有人关心我的意见)
假设所有这些都是正确的,这个声明可能有效:
SELECT T.CASENUM,
T.USER_NAME,
T.AUDIT_DATE AS STARTED,
(SELECT *
FROM (SELECT S.AUDIT_DATE
FROM AUDITHISTORY S
WHERE S.CASENUM=T.CASENUM AND TYPE_ID=2
AND S.USER_NAME=T.USER_NAME
ORDER BY S.AUDIT_DATE ASC,S.AUDIT_USECS ASC
) R WHERE (S.AUDIT_DATE > T.AUDIT_DATE OR (S.AUDIT_DATE = T.AUDIT_DATE AND S.AUDIT_USECS > T.AUDIT_USECS))
AND rownum <= 1) AS ENDED
FROM AUDITHISTORY T WHERE TYPE_ID=1
关于sql - Oracle 10g 上的子查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2430953/