سؤال

يعمل الاستعلام التالي على Oracle 10.2.0.1.0 على Windows، ولكن لا يعمل على Oracle 10.2.0.2.0 على Linux.

خطأ تقرير: خطأ SQL: ORA-00904: "T". "Audit_usecs": معرف غير صالح 00904. 00000 - "٪ S: معرف غير صالح"

يعمل بعد إزالة الاستعلام الفرعي. لقد وجدت أنه في حالة استخدام مجالات T في الاستعلام الفرعي، يحدث خطأ. هل تقول أن الاستعلام الفرعي لا يمكنه الوصول إلى الحقول في الاستعلام الرئيسي؟

ما هي المشكلة؟ كيف يمكنني أن أجعلها تعمل على أوراكل على لينكس؟ شكرا!


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

بانر

أوراكل قاعدة بيانات 10G Enterprise Edition الإصدار 10.2.0.1.0 - Prod PL / SQL Server 10.2.0.1.0 - الإنتاج
Core 10.2.0.1.0 الإنتاج
TNS لنظام التشغيل Windows 32 بت: الإصدار 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 الإصدار 10.2.0.2.0 - الإنتاج
الأساسية 10.2.0.2.0 الإنتاج
TNS لنظام التشغيل Linux: الإصدار 10.2.0.2.0 - الإنتاج
nlsrtl الإصدار 10.2.0.2.0 - الإنتاج

هل كانت مفيدة؟

المحلول 2

هذا خطأ! تحقق من هذا الرابطhttp://forums.oracle.com/forums/thread.jspa؟messageid=4023215.?

أو

إنه خطأ فقط في متصل ب Oracle Database 10G Enterprise Edition الإصدار 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#160559.

نصائح أخرى

أنا أعتبر أنه من المستغرب أن يعمل في أي مكان. أنت تستخدم الاسم المستعار T في العرض المضمنة، ولكن يتم تعريفه فقط في الاختيار الخارجي.

تحديث بعد مراجعة جميع المعلومات المرتبطة به في التعليقات والإجابات الأخرى:

  • حقيقة أنه يعمل في الواقع في واحد / بعض الإصدار كان خطأ في هذا الإصدار وفقا لتوم كتي، وهو مصدر موثوق للغاية لهذا النوع من المعلومات:
  • هناك شيئان في العمل هنا:
    1. عند استخدام Subselect كإطلقة مضمنة، لا يمكنك الإشارة إلى أي شيء من الاختيار الخارجي. انظر آخر نقطة رصاصة في هذا المستند: http://download-west.oracle.com/docs/cd/b19306_01/server.102/b14200/@queries007.htm.
    2. في الاستخدامات الأخرى من Subselects (في جملة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top