如何在SQL中实现多路交集?INTERSECT与INNER JOIN该选哪种?
关于SQL多路交集的实现:INTERSECT vs 多路INNER JOIN
1. 能否用INTERSECT实现多路交集?
完全可以。你给出的思路是正确的,只要修正表名的语法问题(带空格的表名需用引号/方括号包裹,或直接改为无空格的tab1这类命名),就能实现三个表col列的多路交集。修正后的示例代码:
SELECT col FROM tab1 INTERSECT SELECT col FROM tab2 INTERSECT SELECT col FROM tab3
INTERSECT会自动返回所有查询结果的去重交集,它会逐一比对多个结果集,只保留同时存在于所有结果集中的行。
2. INTERSECT 和 多路INNER JOIN 哪个更合适?
这取决于你的具体需求和数据库环境:
- 优先选INTERSECT的场景:
- 仅需获取单列的交集结果,写法更简洁直观,无需手动处理关联逻辑。
- 需要自动去重的特性,且所用数据库支持
INTERSECT(PostgreSQL、SQL Server、Oracle等主流数据库均支持)。
- 优先选多路INNER JOIN的场景:
- 需要同时获取交集列之外的其他关联数据(比如从
tab1中获取col对应的其他字段)。 - 所用数据库不支持
INTERSECT(比如MySQL 8.0之前的版本)。 - 不需要自动去重(可去掉
DISTINCT,而INTERSECT默认去重,若要保留重复需用INTERSECT ALL,但部分数据库不支持该语法)。
- 需要同时获取交集列之外的其他关联数据(比如从
多路INNER JOIN实现同逻辑的示例代码(带去重,匹配INTERSECT的默认行为):
SELECT DISTINCT t1.col FROM tab1 t1 INNER JOIN tab2 t2 ON t1.col = t2.col INNER JOIN tab3 t3 ON t1.col = t3.col
内容的提问来源于stack exchange,提问作者jbuddy_13
相关产品推荐
相关产品推荐

