Oracle 10g上的子查询问题

时间:2010-03-12 06:38:40

标签: sql oracle ora-00904

以下查询适用于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

BANNER

  

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 - 生产

BANNER

  

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 - 生产

2 个答案:

答案 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

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1853075500346799932#1859169400346361423

这只是一个错误 连接到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