हां आप कर सकते हैं, और आप अनुकूलक को इसे पहचानने के लिए भी प्राप्त कर सकते हैं।
पॉल व्हाइट के पास यह छोटा सा किस्सा है :
WHERE NOT EXISTS (
SELECT d.[Data]
INTERSECT
SELECT i.[Data])
यह INTERSECT
. के शब्दार्थ के कारण काम करता है जो नल से निपटते हैं। यह क्या कहता है "क्या वहाँ नहीं . है मान B और मान B से बनी सबक्वेरी में पंक्तियाँ", यह केवल तभी संतुष्ट होगी जब वे अलग-अलग मान हों या एक अशक्त हो और दूसरा नहीं। यदि दोनों नल हैं, तो एक अशक्त के साथ एक पंक्ति होगी।
यदि आप एक्सएमएल क्वेरी प्लान (एसएसएमएस में ग्राफिकल नहीं) की जांच करते हैं, तो आप देखेंगे कि यह d.[Data] <> i.[Data]
तक सभी तरह से संकलित है। , लेकिन इसके द्वारा उपयोग किए जाने वाले ऑपरेटर के पास CompareOp="IS"
. होगा और नहीं EQ
।
पूरी योजना देखें यहां ।
योजना का प्रासंगिक हिस्सा है:
<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>
मुझे लगता है कि ऑप्टिमाइज़र EXISTS / EXCEPT
करने के बजाय इस तरह से बहुत अच्छी तरह से काम करता है ।
मैं आपसे एज़्योर फीडबैक एक उचित ऑपरेटर को लागू करने के लिए