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

Hai câu lệnh cập nhật dưới đây khác nhau như thế nào trong SQL?

Với một phép nối bên trong, sự khác biệt chỉ là sự khác biệt về ngữ nghĩa. Cả hai truy vấn phải tạo ra cùng một kế hoạch truy vấn chính xác và cùng một kết quả.

Tuy nhiên, khi bạn đang sử dụng các phép nối bên ngoài, thì vấn đề quan trọng là nếu điều kiện nằm trên where mệnh đề hoặc on điều khoản trên.

UPDATE li
SET li.Description = im.Description
FROM tbSupplierLineItem li
RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
                                AND li.ProcessedDate >= CONVERT(DATE,GETDATE())

Khác với

UPDATE li
SET li.Description = im.Description
FROM tbSupplierLineItem li
RIGHT JOIN tbIMPACArchieveNew im ON li.ItemId = im.CommomCode 
WHERE li.ProcessedDate >= CONVERT(DATE,GETDATE())

không chỉ ở cấp độ ngữ nghĩa.
Trong khi truy vấn đầu tiên sẽ trả về kết quả mong đợi của một phép nối phải, thì truy vấn thứ hai sẽ trả về kết quả mong đợi từ một phép nối bên trong.
Đó là vì các giá trị bảng bên phải có thể là null nếu bạn có các bản ghi trên bảng bên trái không khớp với chúng và vì so sánh bất kỳ giá trị nào với null (bao gồm cả một giá trị khác) sẽ dẫn đến sai, nên về cơ bản, nó sẽ thay đổi phép nối bên phải thành một phép nối bên trong.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao một giao dịch lồng nhau được cam kết ngay cả khi TransactionScope.Complete () không bao giờ được gọi?

  2. Phương pháp chính xác để xóa hơn 2100 hàng (theo ID) với Dapper

  3. Bộ đệm ẩn đối tượng tạm thời của SQL Server

  4. Xóa tập lệnh SQL Server 2008

  5. Khôi phục cơ sở dữ liệu trong SQL Server 2017