以下查询适用于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数据库10g企业版10.2.0.1.0版 - 产品介绍 PL / SQL版本10.2.0.1.0 - 生产
核心10.2.0.1.0生产
适用于32位Windows的TNS:版本10.2.0.1.0 - 生产
NLSRTL版本10.2.0.1.0 - 生产
Oracle数据库10g企业版10.2.0.2.0版 - 产品介绍 PL / SQL版本10.2.0.2.0 - 生产
核心10.2.0.2.0生产
适用于Linux的TNS:版本10.2.0.2.0 - 生产
NLSRTL版本10.2.0.2.0 - 生产
答案 0 :(得分:4)
我觉得它在任何地方都有用,这令人惊讶。您在内联视图中使用别名T,但它仅在外部选择中定义。
在审核与评论和其他答案相关的所有信息后更新:
假设所有这些都是正确的,这个陈述可能会起作用:
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
答案 1 :(得分:3)
这是一个错误! 检查此链接 http://forums.oracle.com/forums/thread.jspa?messageID=4023215?
这只是一个错误 连接到Oracle数据库10g企业版10.2.0.1.0版
SQL> select * from AUDITHISTORY;
CASENUM AUDIT_DAT USER_NAME AUDIT_USECS TYPE_ID
10 12-MAR-10 USER 100 1
10 14-MAR-10 USER 100 2
10 16-MAR-10 USER 100 2
SQL> SELECT T.CASENUM,
2 T.USER_NAME,
3 T.AUDIT_DATE AS STARTED,
4 (
5 SELECT max(S.AUDIT_DATE) keep (dense_rank first order by S.AUDIT_DATE ASC,S.AUDIT_USECS ASC)
6 from AUDITHISTORY S
7 WHERE S.CASENUM=T.CASENUM AND TYPE_ID=2
8 AND S.USER_NAME=T.USER_NAME
9 AND (
10 S.AUDIT_DATE > T.AUDIT_DATE OR (
11 S.AUDIT_DATE = T.AUDIT_DATE
12 AND S.AUDIT_USECS > T.AUDIT_USECS
13 )
14 )
15 ) as ended
16 FROM AUDITHISTORY T WHERE TYPE_ID=1;
CASENUM USER_NAME已开始结束
10 USER 12-MAR-10 14-MAR-10
更多信息:http://forums.oracle.com/forums/thread.jspa?messageID=4160559#4160559