INTERSECT 和 INNER JOIN 之间有根本区别吗? [复制]
Posted
技术标签:
【中文标题】INTERSECT 和 INNER JOIN 之间有根本区别吗? [复制]【英文标题】:Is there a fundamental difference between INTERSECT and INNER JOIN? [duplicate] 【发布时间】:2019-01-17 10:22:50 【问题描述】:我明白,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
【问题讨论】:
嗨。键与加入和相交/除外无关。任何 2 个表都可以连接和相交/除非需要某些列类型协议。了解他们的定义。 PS 请参阅向下投票箭头鼠标悬停文本。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用一个变体搜索您的标题和关键字作为您的标签。 【参考方案1】:即使在你的情况下,它们也非常不同。
如果id
在任一表中重复,INNER JOIN
将返回重复项。 INTERSECT
删除重复项。 INNER JOIN
永远不会返回 NULL
,但 INTERSECT
将返回 NULL
。
两者非常不同;一个是通常匹配有限列集的运算符,并且可以在任一表中返回零行或多行。另一种是基于集合的运算符,它比较两个集合之间的完整行,并且永远不会返回比较小的表中更多的行。
【讨论】:
谢谢!这有帮助! 请与 INTERSECT ALL 交谈。 内连接不必在键上。【参考方案2】:尝试以下方法,例如:
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
【讨论】:
以上是关于INTERSECT 和 INNER JOIN 之间有根本区别吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
left join right join 和inner join之间的区别
inner join(inner可省) 与 left join 之间的区别
CROSS JOIN和INNER JOIN,LEFT JOIN,RIGHT JOIN,OUTER JOIN之间的区别[重复]