3

以下查询适用于 Windows 上的 Oracle 10.2.0.1.0,但不适用于 Linux 上的 Oracle 10.2.0.2.0。

错误报告:SQL 错误:ORA-00904: "T"."AUDIT_USECS": invalid identifier 00904. 00000 - "%s: invalid identifier"

它在我删除子查询后工作。我发现如果在子查询中使用 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 - 生产
CORE 10.2.0.1.0
用于 32 位 Windows 的生产 TNS:版本 10.2.0.1.0 - 生产
NLSRTL 版本 10.2。 0.1.0 - 生产

横幅

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:版本 10.2.0.2.0 - Production
NLSRTL 版本 10.2.0.2.0 - 生产

4

2 回答 2

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
于 2010-03-12T06:56:28.243 回答
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

仅在 Connected to Oracle Database 10g Enterprise Edition Release 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

于 2010-03-12T08:40:42.963 回答