سؤال

وحاولت فقط أن تفعل فرعي مترابط في بند FROM بيان SELECT في أوراكل، ولكن أعطيت خطأ يشير إلى أنني لا يمكن أن تفعل الارتباط (ما معناه أن لم يتم التعرف Obs.pID).

وينبغي لهذا العمل؟

FROM ml.Person Person 
    JOIN ml.Obs ON Person.pID = Obs.pId
        JOIN (SELECT ObsMax2.pId, ObsMax2.hdId
                , MAX(ObsMax2.obsDate) as maxDate
                FROM ml.Obs ObsMax2
                WHERE ObsMax2.pId = Obs.pId
                    AND ObsMax2.obsDate < {?EndDate}
                GROUP BY ObsMax2.pId, ObsMax2.hdId) ObsMax 
            ON Obs.pId = ObsMax.pId
                AND Obs.hdId = ObsMax.hdId
                AND Obs.obsDate = ObsMax.maxDate

وبلدي الحل على ما يبدو أن يكون لجعله فرعي غير المترابطة، وإضافة معايير الاستعلام الفرعي أن يحافظ عليه من الترشح تماما باهتياج، باهتياج، اتحاد المغرب العربي - <م> OOF عذرا.

وأنا أفضل أن معرفة كيفية ربط صحيح أنه، على الرغم من إن أمكن - وجهة النظر التي تعمل مثل أن فرعي يحتاج إلى وقت طويل لبناء

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

المحلول

ويمكنك تحقيق الغرض من هذا الجزء من الاستعلام باستخدام الدوال التحليلية لتحديد الحد الأقصى للobsDate لكل hdid معرف المنتج و.

وسيكون شيئا مثل:

select ...
from   (
       SELECT pId,
              hdId,
              obsDate
              MAX(obsDate) over (partition by pId, hdId) maxDate
       FROM   ml.Obs
       WHERE  obsDate < {?EndDate}
       )
where  obsDate = maxDate
/

نصائح أخرى

والاستفسارات الفرعية ضمن عبارة FROM لا يمكن الرجوع إلى جداول أخرى من نفس عبارة FROM. إزالة ينبغي أن ObsMax2.pId = بند Obs.pId حل المشكلة ومن أستطيع أن أقول سوف اعطيكم بالضبط نفس النتيجة منذ شرط نفسه هو في الانضمام الشرط. ومع ذلك، كما ذكرتم، قد واجهت مشكلات في الأداء مع وجود GROUP BY في الاستعلام الفرعي.

ومن ما استطيع ان اقول، كنت في محاولة للحصول على سجلات PID / hdId الفردية من ml.Obs مع أكبر obsDate هذا أقل من {ENDDATE}. في هذه الحالة، ماذا عن تحريك استعلام فرعي في جملة WHERE حيث يمكنك ربط ذلك؟ منها مثلا:

select ...
from
  ml.Person Person
  join ml.Obs on Person.PID = Obs.pId
where Obs.obsDate = (
    select max(obsDate)
    from ml.Obs Obs2
    where Obs2.pId = Obs.pId
      and obs2.hdId = Obs.hdId
      and Obs2.obsDate < {EndDate})

ولقد مسبوقة العديد من الجداول الخاصة بك مع "مل". ولكن ليس في كل مكان (الانضمام الأولى، على سبيل المثال). على افتراض انك بحاجة الى ذلك (للمستخدم / أذونات / أيا كان):

والتسجيل ml.Obs ON Person.pID = ** مل. ** Obs.pId

أو

والتسجيل ml.Obs على التوليد تشغيل Person.pID = Obs.pId

وهناك أماكن أخرى حيث ستكون هناك حاجة إلى هذا أيضا.

إذا لم تكن هذه هي الحالة، إزالتها من الاستعلام الخاص بك لأنهم غير ذي صلة وتشتيت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top