اذهب إلى المحتوى

السؤال

نشر

السلام عليكم 

اريد ان اسال ما الفرق بين ال queries التاليه

 

select product_id,year as first_year, quantity, price
from Sales
where(product_id, year) in (select  product_id, min(year) from Sales group by product_id)
// تخرج حلا مختلف

select product_id,min(year) as first_year, quantity, price
from Sales

اري انه لا فرق

 

Screenshot (108).png

Recommended Posts

  • 0
نشر

على الرغم من أن الجملتين قد تبدوان متشابهتين، إلا أنهما تنتجان نتائج مختلفة بسبب كيفية التعامل مع الأعمدة الإضافية بجانب الأعمدة المحسوبة، حيث في الإستعلام الأول يتم تحديد أول سنة لكل منتج باستخدام الاستعلام الداخلي، و يتم بعد ذلك مطابقة السجل بالكامل بناء على product_id, year مع النتيجة المحسوبة من الاستعلام الداخلي، و هذا يعني أنه يتم تحديد سجل واحد فقط لكل منتج يتوافق مع أصغر سنة 

و النتيجة تكون كل منتج سيظهر مرة واحدة مع بيانات quantity وprice التي تتوافق مع السنة الأولى.

أما في الكود الثاني هنا يتم استخدام group by مع product_id، و يتم حساب أصغر سنة لكل منتج، ولكن الأعمدة الأخرى ليست ضمن الدالة التجميعية أو في عبارة group by، و في معظم قواعد البيانات، ستقوم قاعدة البيانات باختيار قيمة عشوائية أو غير محددة من الأعمدة الإضافية quantity وprice للسجلات المتعلقة بكل مجموعة.

  • 0
نشر

الفرق بين الاستعلامين هو في طريقة اختيار السجلات التي يتم عرضها، وسبب الاختلاف في النتائج هو كيفية تعامل كل استعلام مع الأعمدة "quantity" و"price" ففي الاستعلام الأول:

select product_id, year as first_year, quantity, price
from Sales
where (product_id, year) in (
    select product_id, min(year) 
    from Sales 
    group by product_id
);

يتم تحديد السجلات التي تحمل أقل سنة (min(year)) لكل منتج (product_id) الشرط (product_id, year) يضمن أن الصف المحدد هو الذي يحتوي على أقل قيمة للسنة بعدها يتم الاحتفاظ بالأعمدة quantity و price كما هي موجودة في الصف الموافق لأقل سنة.

بينما الاستعلام الثاني:

select product_id, min(year) as first_year, quantity, price
from Sales
group by product_id;

يستخدم group by لتجميع الصفوف حسب product_id بحيث يتم إرجاع أقل سنة (min(year)) لكل منتج، لكن لا يمكن ل SQL هنا معرفة أي قيمة من quantity أو price تختارها لأنهما لا يشتركان في قاعدة التجميع.

لذلك إذا أردت التأكد من أن القيم الخاصة بـ quantity و price صحيحة، استمر باستخدام الاستعلام الأول، لأنه يربط القيم بالسجل الصحيح أما إذا كنت تريد العمل فقط مع السنة الدنيا دون الحاجة للتأكد من ارتباط الأعمدة الأخرى بالسنة، يمكنك استخدام الاستعلام الثاني.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...