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ó.
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