21

我知道,INNER JOIN 是为引用的键创建的,而 INTERSECT 不是。但是在某些情况下,他们俩都可以做同样的事情。那么,以下两个表达式之间是否存在差异(在性能或其他方面)?如果有,哪个更好?

表达式 1:

SELECT id FROM customers 
INNER JOIN orders ON customers.id = orders.customerID;

表达式 2:

SELECT id FROM customers
INTERSECT
SELECT customerID FROM orders
4

2 回答 2

40

即使在您的情况下,它们也非常不同。

如果在任一表中 重复,INNER JOIN则将返回重复项。删除重复项。永远不会回来,但会回来。idINTERSECTINNER JOINNULLINTERSECTNULL

两者非常不同;一个是通常匹配有限列集的运算符,并且可以在任一表中返回零行或多行。另一种是基于集合的运算符,它比较两个集合之间的完整行,并且永远不会返回比较小表中更多的行。

于 2018-08-09T21:04:46.560 回答
13

尝试以下操作,例如:

CREATE TABLE #a (id INT)

CREATE TABLE #b (id INT)

INSERT INTO #a VALUES (1), (NULL), (2)
INSERT INTO #b VALUES (1), (NULL), (3), (1)

SELECT a.id FROM #a a
INNER JOIN #b b ON a.id = b.id

SELECT id FROM #a
INTERSECT
SELECT id FROM #b
于 2018-08-09T21:06:43.210 回答