在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.
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拆分字符串,但不推荐。
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.
博客园
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。