المترابطة أوراكل فرعي في FROM قائمة
سؤال
وحاولت فقط أن تفعل فرعي مترابط في بند 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
وهناك أماكن أخرى حيث ستكون هناك حاجة إلى هذا أيضا.
إذا لم تكن هذه هي الحالة، إزالتها من الاستعلام الخاص بك لأنهم غير ذي صلة وتشتيت.