Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cú pháp và đóng gói INNER JOIN kỳ lạ

Dấu ngoặc đơn không thay đổi ngữ nghĩa. Vị trí của ON mệnh đề điều khiển thứ tự xử lý logic các phép nối.

Truy vấn đầu tiên

SELECT Customer.Name,
       Product.Desc,
       Transaction.Date
FROM   Product
       INNER JOIN Transaction
         ON Transaction.ProductID = Product.ID
       INNER JOIN Customer
         ON Transaction.CustomerID = Customer.ID 

Truy vấn thứ hai

(Đã xóa dấu ngoặc đơn thừa)

SELECT Customer.Name,
       Product.Desc,
       Transaction.Date
FROM   Product
       INNER JOIN Transaction
                  INNER JOIN Customer
                    ON Transaction.CustomerID = Customer.ID
         ON Transaction.ProductID = Product.ID 

Vì vậy, về mặt logic trong ví dụ đầu tiên của bạn, tham gia vào Transaction, Product xảy ra đầu tiên sau đó bảng ảo kết quả từ đó được kết hợp với Customer , trong khi trong ví dụ thứ hai của bạn, tham gia vào Transaction, Customer xảy ra đầu tiên sau đó bảng ảo kết quả từ đó được kết hợp với Product

Điều này chỉ về mặt logic và vì các phép nối bên trong vừa là kết hợp vừa có tính chất giao hoán, điều này có thể sẽ không tạo ra bất kỳ sự khác biệt nào đối với kế hoạch thực thi (trừ khi bạn thêm OPTION (FORCE ORDER) đối với truy vấn) nhưng nó có thể làm được đối với các phép nối bên ngoài.

Đây là được Itzik Ben Gan đề cập tại đây nhưng bài viết có một số điểm không chính xác, hãy xem thư tiếp theo của Lubor Kollar nữa.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MAMP có nên trả về ::1 dưới dạng IP trên localhost không?

  2. Định dạng nguồn SSIS Chuyển đổi ngầm định cho ngày giờ

  3. Thay đổi CTE SELECT thành hàm do người dùng xác định giá trị bảng

  4. SQL Server - Xóa tất cả các ký tự ASCII không in được

  5. Làm cách nào để xem các tham số của procs hiện đang chạy trong SQL Server 2008