在 SQL 语句中将“IN”与子查询一起使用
Posted
技术标签:
【中文标题】在 SQL 语句中将“IN”与子查询一起使用【英文标题】:Using 'IN' with a sub-query in SQL Statements 【发布时间】:2011-10-21 09:58:45 【问题描述】:在我们可以使用 JOIN 的地方,在 SQL 语句中使用“IN”关键字是否存在性能问题?
SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)
【问题讨论】:
【参考方案1】:不,可以使用。
您可以在所有 RDBMS 中使用 IN、EXISTS 编写上述查询,有些还支持 INTERSECT。
从语义上讲,这是一个半联接,它“给我表 A 中的行,我在表 B 中至少有一个匹配项”。 INNER JOIN 是“给我所有匹配的行”
所以如果 TableA 有 3 行,TableB 有 5 行匹配:
INNER JOIN 是 15 行 半连接是 3 行这就是我和其他 SQL 类型在这里推送 IN 和 EXISTS 的原因:JOIN 是错误的,需要 DISTINCT 并且会更慢。
EXISTS 支持多列 JOIN,IN 在 SQL Server 中不支持(在其他方面支持)。
【讨论】:
不能用。看我的回答。 是的,我错了。我试图通过给你举个例子来证明我是对的。然而,这个例子表明我错了。我道歉并删除了我的答案。【参考方案2】:您可以使用 group by 而不是一个 distinct。我曾遇到过使用 join 获得更好响应时间的案例。通常,当我通过主键/外键关系连接所有行并且查看非键列的位置时。特别是如果多个连接。 IN 有时会强制进行索引扫描,如果连接到 PK,则连接通常会使用搜索。当您设计表时,将主键排列成相同的顺序并明确声明 PK / FK 关系。加入不限于PK / FK。但是连接的一个常见用途是遍历 PK / FK 关系,在这种情况下,我使用键对齐的连接的经验是最好的性能。
【讨论】:
【参考方案3】:您可以阅读here,JOINS 比子选择更快。
【讨论】:
正如您在其他地方看到的,JOIN 速度较慢。 explainextended.com/2009/06/16/in-vs-join-vs-exists 传播垃圾的语义不同-1 不知道区别 你的链接也没有提到这个以上是关于在 SQL 语句中将“IN”与子查询一起使用的主要内容,如果未能解决你的问题,请参考以下文章