3

次のクエリは、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 リリース 10.2.0.1.0 - Prod 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 リリース 10.2.0.2.0 - Prod PL/SQL リリース 10.2.0.2.0 - プロダクション
CORE 10.2.0.2.0 プロダクション
TNS for Linux: バージョン 10.2.0.2.0 - プロダクション
NLSRTL バージョン 10.2.0.2.0 - 製造

4

2 に答える 2

4

どこでも通用するとは驚きです。インライン ビューでエイリアス T を使用していますが、これは外側の選択でのみ定義されています。

コメントやその他の回答にリンクされているすべての情報を確認した後、更新します。

  • Tom Kyte によると、1 つまたはいくつかのバージョンで実際に動作するという事実は、そのバージョンのバグであり、この種の情報の非常に信頼できるソースです。 p=100:11:0::::P11_QUESTION_ID:1853075500346799932#1859169400346361423
  • ここでは、次の 2 つのことが行われています。
    1. 副選択をインライン ビューとして使用する場合、外側の選択を参照することはできません。このドキュメントの最後の箇条書きを参照してください: http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/queries007.htm
    2. サブセレクトの他の使用法 (select 句または where 句) では、外側の select から参照できますが、直接囲んでいる select からのみ参照できます。(私は個人的にこれはばかげた制限だと思いますが、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
于 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 STARTED ENDED


    10 USER                 12-MAR-10 14-MAR-10

詳細: http://forums.oracle.com/forums/thread.jspa?messageID=4160559#4160559

于 2010-03-12T08:40:42.963 に答える