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

Có cách nào để đơn giản hóa so sánh NULL của 2 giá trị không

Có, bạn có thể và bạn cũng có thể yêu cầu trình tối ưu hóa nhận ra nó.

Paul White có chút lỗi này :

WHERE NOT EXISTS (
    SELECT d.[Data]
    INTERSECT
    SELECT i.[Data])

Điều này hoạt động vì ngữ nghĩa của INTERSECT mà đối phó với null. Điều này nói lên "có không các hàng trong truy vấn con được tạo thành từ giá trị B và giá trị B ", điều này sẽ chỉ được thỏa mãn nếu chúng là các giá trị khác nhau hoặc một giá trị rỗng và một giá trị khác thì không. Nếu cả hai đều là giá trị rỗng, sẽ có một hàng có giá trị rỗng.

Nếu bạn kiểm tra kế hoạch truy vấn XML (không phải kế hoạch đồ họa trong SSMS), bạn sẽ thấy rằng nó biên dịch hoàn toàn xuống d.[Data] <> i.[Data] , nhưng toán tử nó sử dụng sẽ có CompareOp="IS" chứ không phải EQ .

Xem toàn bộ gói tại đây .

Phần có liên quan của kế hoạch là:

                <Predicate>
                  <ScalarOperator ScalarString="@t1.[i] as [t1].[i] = @t2.[i] as [t2].[i]">
                    <Compare CompareOp="IS">
                      <ScalarOperator>
                        <Identifier>
                          <ColumnReference Table="@t1" Alias="[t1]" Column="i" />
                        </Identifier>
                      </ScalarOperator>
                      <ScalarOperator>
                        <Identifier>
                          <ColumnReference Table="@t2" Alias="[t2]" Column="i" />
                        </Identifier>
                      </ScalarOperator>
                    </Compare>
                  </ScalarOperator>
                </Predicate>

Tôi thấy trình tối ưu hóa hoạt động rất tốt theo cách này, thay vì EXISTS / EXCEPT .

Tôi mong bạn bỏ phiếu cho Phản hồi Azure để triển khai toán tử thích hợp



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giới thiệu Tính năng mới - Báo cáo đám mây Spotlight

  2. Lỗi tên cột không hợp lệ khi gọi chèn sau khi tạo bảng

  3. Tham số hóa một mệnh đề SQL IN

  4. Làm cách nào để xóa dấu và tất cả các ký tự <> a..z trong sql-server?

  5. Chuyển đổi DateTime sang Hex tương đương trong VB.NET