Transact-SQL 中的对称差分运算?

Kut*_*ike 12 sql-server t-sql

我一直都知道UNIONSQL 中的运算符,但直到最近才发现还有其他的集合运算符,INTERSECTEXCEPT. 我一直无法找到执行第四大集合运算符的运算符,即对称差异(例如 . 的相反INTERSECT

看起来我可以通过使用类似的东西来获得所需的输出

SELECT Field FROM A UNION SELECT Field FROM B 
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
Run Code Online (Sandbox Code Playgroud)

(假设我得到了正确的优先级),或者通过做一个反完全连接:

SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL
Run Code Online (Sandbox Code Playgroud)

但是这两个看起来都像是相当密集的查询,尤其是与其他三个基本的集合操作相比。SQL中是否存在对称差异操作而我在文档中找不到它?或者是否有一种“规范”的方式在 T-SQL 中实现它?

usr*_*usr 3

所有集合运算符都被转换为连接或类似连接的运算符。您可以在查询计划中见证这一点。

因此,您拥有的完整外部连接是您可以做的最有效的。当然,忽略这种情况(希望这种情况很少见):优化器选择了一个糟糕的计划,而重写碰巧运气好,性能更好。这总是可能发生的。

  • @MichaelEdenfield另一方面,当您*想要*未在比较/区分中使用的其他列时该怎么办?您可以通过连接来做到这一点,但不能通过相交/例外来做到这一点。所以我可以看到,在某些情况下,从长远来看,变异实际上最终会变得更加复杂。 (2认同)