MSSQL中IN语法怎么用?怎么提升查询效率?

文章导读
在MSSQL中使用IN语法的基本用法是:SELECT * FROM table WHERE column IN (value1, value2, value3)。为了提升查询效率,避免在IN子句中使用子查询,而是用临时表或表变量存储值,然后用JOIN替换IN。例如:CREATE TABLE #temp (id INT); INSERT INTO #temp VALUES (1),(2),(3);
📋 目录
  1. A CSDN博客
  2. B Stack Overflow
  3. C SQLServerCentral
  4. D 知乎讨论
  5. E Microsoft Docs片段
  6. F 博客园
A A

在MSSQL中使用IN语法的基本用法是:SELECT * FROM table WHERE column IN (value1, value2, value3)。为了提升查询效率,避免在IN子句中使用子查询,而是用临时表或表变量存储值,然后用JOIN替换IN。例如:CREATE TABLE #temp (id INT); INSERT INTO #temp VALUES (1),(2),(3); SELECT * FROM main_table m INNER JOIN #temp t ON m.id = t.id。

CSDN博客

SQL Server中IN的使用方法:SELECT * FROM 表名 WHERE 字段 IN ('值1','值2','值3'); 如果IN里面的值很多,效率很低,建议改写成EXISTS:SELECT * FROM 表1 WHERE EXISTS(SELECT 1 FROM 表2 WHERE 表1.id=表2.id)。

Stack Overflow

The IN operator is fine for small lists, but for large lists or subqueries, it's slow because it can't use indexes effectively. Better to use a temp table: CREATE TABLE #IDs (ID int PRIMARY KEY); INSERT #IDs SELECT ID FROM SomeTable WHERE ...; Then SELECT * FROM MainTable WHERE ID IN (SELECT ID FROM #IDs); No, even better: INNER JOIN #IDs ON MainTable.ID = #IDs.ID and add index on #IDs.

MSSQL中IN语法怎么用?怎么提升查询效率?

SQLServerCentral

IN with a subquery often performs poorly due to nested loops. Replace with EXISTS or JOIN. For static lists longer than 10 items, use a table-valued parameter or temp table. Example: DECLARE @IDs TABLE (ID INT PRIMARY KEY); INSERT @IDs VALUES (1,2,3); SELECT * FROM Orders o JOIN @IDs i ON o.CustomerID = i.ID;

知乎讨论

MSSQL IN语法:WHERE id IN (1,2,3,4)。效率低的原因是IN列表大时无法优化。优化方法:用表变量或临时表,建主键或索引,然后JOIN。或者用XML拆分字符串,但不推荐。

MSSQL中IN语法怎么用?怎么提升查询效率?

Microsoft Docs片段

The IN predicate can be used to test for membership in a list of values or for membership in a subquery result. However, for performance, when the list is long, consider using a table variable or temporary table with an index.

MSSQL中IN语法怎么用?怎么提升查询效率?

博客园

IN子句查询慢?试试这个:将IN的值拆成临时表,建索引,然后JOIN。测试结果:原IN查询1秒,JOIN后0.01秒。

FAQ
Q: IN和EXISTS有什么区别?
A: IN返回子查询结果匹配,EXISTS只要一行匹配就停止,效率更高。
Q: IN列表超过1000个值怎么办?
A: 必须用临时表+JOIN,不能用IN。
Q: 表变量和临时表哪个快?
A: 小数据集用表变量,大数据集临时表并加索引。
Q: 如何处理动态IN列表?
A: 用字符串拆分函数+表变量,或Table-Valued Parameter。