نصيحة من الضفدع ل Oracle Formatter
سؤال
ماذا يعني التحذير؟
لماذا هو المثال الثاني أسوأ من الأول؟
SELECT product_id, prod.name name, sample_id
FROM lims.sample JOIN lims.product prod USING (product_id)
ضد.
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample)
JOIN lims.product prod
/* ADVICE: [131] This item has not been declared, or it refers to a label */
USING (product_id)
/* ADVICE:
ADVICE SUMMARY
Count Recommendation
----- --------------
1 [131] This item has not been declared, or it refers to a label
The Oracle equivalent error messages are PLS-00320 and
PLS-0321.
*/
FYI: كلا الاستعلامات تعمل بشكل جيد وإرجاع نفس النتائج.
المحلول
وضع جانبا جداول البيانات، والفهارس، والإحصاءات المجمعة؛ بشكل عام، السائدة غير المستهلكة ينبغي تفوق السدود المتداخلة.
نصائح أخرى
تخميني: يبدو أن الضفدع لا تحل محل الاستعلام بنفس الطريقة التي ستقوم بها أوراكل.
في الاستعلام الأول، ربما يتحقق الضفادع تعريفات الجدول ل Lims.Sample و Lims.Product، وتجد العمود "product_id" في كليهما، لذلك فلا بأس بذلك.
في الاستعلام الثاني، لا يمكن للضفدع التحقق من تعريف الجدول للجزء الأول من الصلة لأنه استفسار متداخل؛ لذلك ربما يستسلم ويمنحك هذه النصيحة (وهذا هو السبب في أن النصيحة تقول "... أو تشير إلى تسمية" والتي ربما تكون كحولية).
أود أن أتجاهل المشورة في هذه الحالة، خاصة وأنها تعمل بشكل جيد وإرجاع نفس النتائج.
مجرد تخمين، ولكن في الاستعلام الثاني لا يتم تسمية إعداد الاستقبال الخاص بك - حاول إعطائها اسم مستعار؛ علي سبيل المثال:
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample) samp
JOIN lims.product prod
USING (product_id)