Đây là bản chất của một tham gia bên ngoài (trong trường hợp này là một tham gia bên trái). Một tham gia bên trái có bảng chính của bạn (Khách hàng), phù hợp với nó bằng các tiêu chí để tham gia bảng (Orders). Đối với mỗi hàng trong Khách hàng không có kết quả phù hợp, không giống như tham gia bên trong, nó không loại bỏ hàng. Thay vào đó, nó thêm tất cả các trường từ Đơn đặt hàng nhưng đặt null vào chúng.
Nhìn vào ví dụ này:
Table A Table B
┌──────┬──────┐ ┌──────┬──────┐
│field1│field2│ │field3│field4│
├──────┼──────┤ ├──────┼──────┤
│A │1 │ │1 │One │
│B │2 │ │3 │Three │
│C │3 │ └──────┴──────┘
└──────┴──────┘
Các bảng bên tham gia (giữa field2 và field3) là:
┌──────┬──────┬──────┬──────┐
│field1│field2│field3│field4│
├──────┼──────┤──────┼──────┤
│A │1 │1 │One │
│C │3 │3 │Three │
└──────┴──────┴──────┴──────┘
Nhưng các bảng bên ngoài tham gia phải cung cấp cho bạn tất cả các kỷ lục, và nếu không có kết quả phù hợp, hãy đặt null.
┌──────┬──────┬──────┬──────┐
│field1│field2│field3│field4│
├──────┼──────┤──────┼──────┤
│A │1 │1 │One │
│B │2 │NULL │NULL │⬅︎ No match
│C │3 │3 │Three │
└──────┴──────┴──────┴──────┘
Bây giờ điều gì sẽ xảy ra nếu không có kết quả nào trong bảng 2? Ví dụ, nếu bạn thêm một điều kiện không thể trong mệnh đề ON? Sau đó, tất cả các bản ghi trong kết quả sẽ trông giống như "Không phù hợp"
┌──────┬──────┬──────┬──────┐
│field1│field2│field3│field4│
├──────┼──────┤──────┼──────┤
│A │1 │NULL │NULL │⬅︎ No match (because of impossible condition)
│B │2 │NULL │NULL │⬅︎ No match (because of impossible condition)
│C │3 │NULL │NULL │⬅︎ No match (because of impossible condition)
└──────┴──────┴──────┴──────┘
Vì vậy, nó không quan trọng nếu không có trận đấu vì không có kỷ lục trong Table2 với ID nhất định, hoặc nếu không có phù hợp bởi vì bạn đã thêm một điều kiện không thể. Kết quả của phép nối ngoài là các trường được cho là đến từ Table2 sẽ được thay thế bằng null. Bởi vì đó là cách một phép nối ngoài được xác định.
Bây giờ các bảng thế giới thực:
Bạn không thực sự có bất cứ hồ sơ nào ở bảng Orders có OrderID là null (trừ khi bạn thiết kế nó rất nặng). Vì vậy, nếu bạn đặt điều kiện đó trong mệnh đề ON, nó sẽ không tìm thấy bản ghi nào đáp ứng tiêu chí của bạn. Trong trường hợp này, bởi vì đây là một bên ngoài (bên trái) tham gia, bạn nhận được tất cả các bản ghi khách hàng origintal, và bởi vì không có trận đấu, mỗi người trong số họ có các lĩnh vực từ đơn đặt hàng tất cả null.
Trong trường hợp bạn đặt điều kiện trong WHERE
, bạn đã thực sự sử dụng tốt hành vi này của việc kết nối trái. Bạn đã kết hợp từng khách hàng với thứ tự của nó. Nếu có một kết quả phù hợp - bạn đã nhận được ID đặt hàng thực tế. Nhưng trong trường hợp không có kết quả phù hợp - những thứ bạn đang tìm kiếm - nó sẽ thêm một ID thứ tự không hợp lệ.
Điều khoản where sau đó yêu cầu nó chỉ cung cấp cho bạn các bản ghi đã xảy ra. Đó là, các hồ sơ không có thứ tự khớp trong Đơn đặt hàng.
Tôi hiểu trực giác tại sao bạn nghĩ như vậy, nhưng tôi nghĩ lý do là 'BẬT' được sử dụng để nối các bảng vào một điều kiện nhất định. Những gì bạn đang cố gắng làm là tìm các hàng WHERE một điều kiện là đúng sự thật. Tôi không biết nếu điều này là bất cứ nơi nào gần sự thật, nhưng đó là cách tôi đã đến để suy nghĩ về nó và biết khi nào sử dụng những gì. – AdamMc331
AND o.OrderID là thứ gây rối loạn. Nó sẽ hoạt động chính xác cho đến khi nó chạm vào điều kiện AND .... – rvphx