在SQL语句中使用'IN'和子查询

时间:2011-08-06 09:54:20

标签: sql sql-server tsql sql-in

在我们可以使用JOIN的地方,在SQL语句中使用“IN”关键字是否存在任何性能问题?

SELECT xxx
FROM xxx
WHERE ID IN (SELECT Id FROM xxx)

3 个答案:

答案 0 :(得分:10)

不,可以使用。

您可以在所有RDBMS中使用IN,EXISTS编写上述查询,有些还支持INTERSECT。

从语义上讲,这是一个半连接,它“给我表A中的行,其中我在tableB中至少有一个匹配”。 INNER JOIN是“给我所有匹配的行”

因此,如果TableA有3行而TableB有5行匹配:

  • INNER JOIN是15行
  • 半连接是3行

这就是我和其他SQL类型推送IN和EXISTS的原因:JOIN错误,需要DISTINCT并且速度会慢。

EXISTS支持多列JOIN,IN不在SQL Server中(在其他情况下也是如此)。

答案 1 :(得分:0)

而不是一个独特的,你可以使用group by。我有过这样的情况,我使用join可以获得更好的响应时间。通常当我通过主键/外键关系连接所有行并且where在哪里查看非键列时。特别是如果有多个连接。 IN有时可以强制进行索引扫描,如果要进入PK,则连接将典型地使用搜索。在设计表格时,表格会排列主键,因此它们的顺序相同,并明确声明PK / FK关系。加入不限于PK / FK。但是,连接的一个常见用途是走PK / FK关系,在这种情况下,我使用连接键的连接的经验是最佳性能。

答案 2 :(得分:-1)

正如您可以阅读here,JOINS比子选择更快。