Tôi có ba bảng:Vấn đề với INNER JOIN và LEFT/RIGHT OUTER JOIN
- Orders
- OrderId, int PK
- ID khách hàng, int FK đến khách hàng, NULL phép
- Khách hàng
- ID khách hàng, int PK
- CompanyId, int FK cho Công ty, NULL không được phép
- companie s
- CompanyId, int PK
- Tên, nvarchar (50)
Tôi muốn chọn tất cả các đơn đặt hàng, không có vấn đề nếu họ có một khách hàng hay không, và nếu họ có một khách hàng sau đó cũng là tên công ty của khách hàng.
Nếu tôi sử dụng truy vấn này ...
SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Orders
LEFT OUTER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
INNER JOIN Companies
OM Customers.CompanyId = Companies.CompanyId
... nó chỉ trả về đơn đặt hàng mà có một khách hàng. Nếu tôi thay INNER JOIN
bởi LEFT OUTER JOIN
...
SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Orders
LEFT OUTER JOIN Customers
ON Orders.CustomerId = Customers.CustomerId
LEFT OUTER JOIN Companies
OM Customers.CompanyId = Companies.CompanyId
... nó hoạt động nhưng tôi không hiểu tại sao điều này là cần thiết vì các mối quan hệ giữa Customers
và Companies
được yêu cầu: Một khách hàng phải có một công ty.
Một phương pháp khác mà làm việc cũng có vẻ là:
SELECT Orders.OrderId, Customers.CustomerId, Companies.Name
FROM Companies
INNER JOIN Customers
ON Companies.CompanyId = Customers.CompanyId
RIGHT OUTER JOIN Orders
OM Customers.CustomerId Orders.CustomerId
truy vấn này có số lượng bên trong và bên ngoài tham gia mà tôi mong đợi nhưng vấn đề là nó là khó đọc đối với tôi vì tôi có truy vấn của tôi là truy vấn của đơn đặt hàng trong trường hợp đơn đặt hàng là "gốc" của lựa chọn chứ không phải công ty. Ngoài ra việc sử dụng RIGHT OUTER JOIN
là khá xa lạ đối với tôi.
Truy vấn cuối cùng là một phần nhỏ của truy vấn được tạo bởi nhà thiết kế cho Báo cáo dịch vụ báo cáo SQL Server. Tôi đang cố gắng để viết truy vấn bằng tay mà không có bề mặt thiết kế bởi vì nó là quá đông đúc và tôi đang gặp vấn đề để duy trì truy vấn sau nhiều thay đổi và nhiều thay đổi được mong đợi trong tương lai. Vì vậy, tôi muốn cung cấp cho truy vấn một cấu trúc có thể đọc được bằng cách nào đó.
Câu hỏi:
- Tại sao không truy vấn 1 công việc như tôi mong đợi?
- Truy vấn 2 là giải pháp đúng mặc dù (hoặc vì?) Nó sử dụng hai THAM GIA TRÁI PHIẾU KHÁC?
- Truy vấn có phải là giải pháp đúng không?
- Có cách nào tốt hơn để viết truy vấn không?
- Có một số quy tắc chung về ngón tay cái và cách thực hành cách viết truy vấn với nhiều kết nối bên ngoài và bên trong theo cách dễ đọc không?
Tôi không nói bạn sai nhưng làm thế nào để đơn đặt hàng không có khách hàng. Đơn đặt hàng là sự kết hợp giữa sản phẩm và khách hàng chắc chắn là – DavidB
@DavidB: Không phải là mô hình thực. Chỉ cần nghĩ đến các lệnh "vô danh" mà một công ty sản xuất có đơn đặt hàng nội bộ để sản xuất trên cổ phiếu mà không cần khách hàng tham khảo ... hoặc một cái gì đó tương tự. – Slauma
Một giải pháp ở đây là có hồ sơ khách hàng "ẩn danh" mà bạn có thể đối sánh với những điều này, thay vì không có khách hàng nào cả. Bạn có thể sẽ thấy cách tiếp cận này cũng giúp với nhiều báo cáo khác. –