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