سؤال

ماذا يعني التحذير؟

لماذا هو المثال الثاني أسوأ من الأول؟

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top