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

SQL NOT IN không hoạt động

SELECT foreignStockId
FROM   [Subset].[dbo].[Products]  

Có thể trả về NULL .

NOT IN truy vấn sẽ không trả về bất kỳ hàng nào nếu có NULL s tồn tại trong danh sách NOT IN các giá trị. Bạn có thể loại trừ chúng một cách rõ ràng bằng cách sử dụng IS NOT NULL như bên dưới.

SELECT stock.IdStock,
       stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL) 

Hoặc viết lại bằng NOT EXISTS thay vào đó.

SELECT stock.idstock,
       stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock) 

Cũng như có ngữ nghĩa mà bạn muốn kế hoạch thực thi cho NOT EXISTS thường đơn giản hơn như đã xem ở đây.

Lý do cho sự khác biệt trong hành vi là do ba logic có giá trị được sử dụng trong SQL. Các dự đoán có thể đánh giá thành True , False hoặc Unknown .

A WHERE mệnh đề phải đánh giá thành True để trả lại hàng nhưng không thể thực hiện được với NOT IN khi NULL hiện như được giải thích bên dưới.

'A' NOT IN ('X','Y',NULL) tương đương với 'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)

  • 'A' <> 'X' =True
  • 'A' <> 'Y' =True
  • 'A' <> NULL =Unknown

True AND True AND Unknown đánh giá thành Unknown mỗi bảng sự thật cho ba lôgic có giá trị.

Các liên kết sau có một số thảo luận bổ sung về hiệu suất của các tùy chọn khác nhau.

  • Tôi có nên sử dụng NOT IN , OUTER APPLY , LEFT OUTER JOIN , EXCEPT hoặc NOT EXISTS ?
  • NOT IN so với NOT EXISTS so với LEFT JOIN / IS NULL :Máy chủ SQL
  • Left outer join so với NOT EXISTS
  • NOT EXISTS so với NOT IN


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. phân tách các giá trị được phân tách bằng dấu phẩy và lưu trữ trong bảng trong máy chủ sql

  2. Sử dụng SQL Server Profiler | Khắc phục sự cố hiệu suất máy chủ SQL -5

  3. Tìm hiểu xem một đối tượng có phải là một hàm có giá trị bảng trong SQL Server với OBJECTPROPERTY () hay không

  4. Cách áp dụng định dạng có điều kiện cho một số trong SQL Server bằng cách sử dụng FORMAT ()

  5. Làm cách nào để mô phỏng UNPIVOT trong Access?