SQL Server中大型IN子句的替代方法

时间:2015-11-09 22:06:03

标签: c# sql-server

我目前正在重构一个函数,该函数根据提供的搜索条件构建我们的自定义WHERE子句。我遇到的一个问题是用户访问项目。我从索赔服务中收到用户有权访问的所有项目ID的List<long>。目前,它被格式化为IN子句:

SELECT * FROM items WHERE project_id IN (1, 2, 3, 4)

随着系统的扩展,这将成为可能数千个ID的气球。我已经研究过如何避免使用IN子句,但大多数人使用存储过程或创建临时表并加入到该子句中。截至目前,我必须使用声明服务和我的ID列表。

考虑到我的约束,有没有更好的方法呢?如果没有,我可以将问题升级为更大的重构。提前谢谢。

3 个答案:

答案 0 :(得分:1)

IN Clause是一种有效的方法。

最佳做法:永远不要对列使用通配符,而是使用列的名称:

SELECT Collumn01, Collumn02, ... 
FROM items 
WHERE project_id IN (1, 2, 3, 4)

我建议你尝试在index_id列中添加一个索引。

这会加快你的执行速度。

很高兴为您服务!

答案 1 :(得分:1)

我假设您的列表是作为分隔字符串提供的;我刚刚回答了一个关于如何在几分钟前在这个网站上解决这个限制的类似问题。

链接:Work around 'IN' clause limitation

答案 2 :(得分:0)

为什么你有WHERE project_id IN (1, 2, 3, 4)?这些ID的特别之处是什么?还有其他ID不特别吗?如果某些ID存在特殊情况,您应该创建一个存储该表的表;不要将特殊性硬编码到SQL中。

CREATE TABLE Project (project_id INT PRIMARY KEY,
    is_special INT)

然后标记所有特殊项目:

UPDATE Project SET is_special = 1 WHERE project_id IN (1, 2, 3, 4)

从现在开始,请检查Project.is_special而非个人project_id

SELECT whatever FROM Items i JOIN Project p ON p.project_id=i.projectID
WHERE p.is_special = 1