【发布时间】:2012-02-02 04:02:40
【问题描述】:
我刚刚在 MSDN 库中阅读了关于 EXCEPT 和 INTERSECT 的内容,并遇到了这个如何使用 INTERSECT 的示例:
USE AdventureWorks2008R2 GO
SELECT ProductID
FROM Production.Product
INTERSECT
SELECT ProductID
FROM Production.WorkOrder ;
--Result: 238 Rows (products that have work orders)
也许我是老派,但我通常会使用以下代码来达到相同的结果:
SELECT P.ProductID
FROM Production.Product P
INNER JOIN Production.WorkOrder W ON W.ProductID = P.ProductID
是我遗漏了什么,还是 INTERSECT 与 INNER JOIN 相同?使用其中一个对性能有好处吗?
除了相同的问题。这是怎么回事:
USE AdventureWorks2008R2;
GO
SELECT ProductID
FROM Production.Product
EXCEPT
SELECT ProductID
FROM Production.WorkOrder ;
--Result: 266 Rows (products without work orders)
与此不同:
SELECT P.ProductID
FROM Production.Product P
LEFT JOIN Production.WorkOrder W ON W.ProductID = P.ProductID
WHERE W.ProductID IS NULL
?
【问题讨论】:
-
-1:这不是 INTERSECT 的工作原理。您的第一个示例不返回具有工作订单的产品;它返回与产品的工作订单 ID 具有相同 ID 的任何产品的 ID。
标签: tsql