سؤال

هل يمكن لأحد أن يشرح لي لماذا تسفر عن استفسار التاليتين نتائج مختلفة؟

SELECT
    o.*
FROM
    Customer c
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID AND o.OrderType = 'Cash'
WHERE
    c.Country = 'USA'

SELECT
    o.*
FROM
    Customer c
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID
WHERE
    c.Country = 'USA'
AND
    o.OrderType = 'Cash'

شكرا.

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

المحلول

أول واحد يسمح للنظام أن يكون فارغا، لأنه انضم إلى اليسار.
والثاني لا، لأنه يتحقق من قيمة O.RordType بعد الانضمام.

ما يعادل سيكون (على افتراض أن الطلبات لا يمكن أن يكون فارغا)

SELECT
    o.*
FROM
    Customer c
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID
WHERE
    c.Country = 'USA'
AND
    (o.OrderType = 'Cash' OR o.OrderType IS NULL)

نصائح أخرى

إنه الانضمام الأيسر.

في المقام الأول، قد تحصل على سجلات أقل، لأن عميل واحد فقط سيمر إلى الحالة التي يتم فيها تصفية أوامره من قبل الشرط النقدية في الانضمام.

في الحالة الثانية، ستمر المزيد من أزواج ترتيب العملاء، وقد تترك المزيد بعد المرشحات حيث.

تأكد من أنك بحاجة حقا إلى الانضمام الأيسر، وإذا كان الأمر كذلك، فتأكد من أي من هذين الدلالات التي تحتاجها في هذه الحالة.

في المثال الأول، يتم تطبيق حالة التصفية أولا على تصفية طلبات نوع الطلب النقدية ثم ينضم إلى جدول العميل.

في المثال الثاني، يتم ربط جدولين ثم يتم تطبيق الحالة المرتبطة. ومن هنا ستكون النتيجة مختلفة.

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