创建在Id列上使用大量过滤的查询的最佳方法是什么?

时间:2014-05-26 17:37:57

标签: c# sql sql-server sql-server-2008

在我的应用程序中,我将不得不使用许多动态查询,我必须只选择按其ID过滤的某些项目,例如:

SELECT *
FROM Data
WHERE Id IN (231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335)

我确信使用IN实际上并不是在术语和性能方面实现这一目标的最佳方式,而且我事先无法知道我可能想要检索的ID数量,因此最终可能会大于允许IN条款中的多个项目的限制......

为了能够进行这种过滤,最好的机制是什么?

我想过使用临时表来插入Ids,然后在进行数据查询时使用此表的连接,但我不确定总是在此临时表中删除和插入的性能,而且Ids列表是依赖于用户,因此User1可能正在使用Ids 1-200进行查询,而User2同时使用Ids 201-500进行查询...

由于

3 个答案:

答案 0 :(得分:3)

如果适用,您可以创建并使用Table-Valued Parameters。首先,在服务器上定义User-Defined Table Types,然后在客户端创建类型为SqlDbType.Structured的参数,将参数的TypeName属性设置为User-Defined Table Types名称,使用支持的类型数据之一填充table-valued parameter

有关详细信息,请参阅MSDN文章Table-Valued Parameters

答案 1 :(得分:0)

也许使用CTE?喜欢

;WITH filter AS 
(
   SELECT ID FROM Somwhere
)

SELECT * FROM filter 
JOIN data ON filter.id = data.id

--Lets choose now next filter

;WITH filter AS
(
    SELECT Id FROM newCriteria
)

- 继续......

如果有大量的id,你可能会有机会声明一些@MinID,@ MaxID然后只使用

Where ID Between @MinID AND @MaxID 

度过愉快的一天:)

答案 2 :(得分:0)

通常在这些列中,提问者暗示他正在做这样的事情。

query 1
select id 
from table1
where whatever

然后

query 2
select *
from table2
where id in (the list from table 1)

将两个表放在同一个数据库中。换句话说,提问者不知道如何加入表格。

这可能不是这里的情况,因为@ibiza提到在他的最后一段中加入表格。这表明有多个数据库在起作用。如果它们位于同一服务器上,则更好的方法是获取适当的权限并使用数据库名称限定表。像这样:

from database1.schemaname.tablename t1 join database2.schemaname.tablename t2
on t1.id = t2.id

但是,这两个数据库可能不在同一台服务器上。如果是这种情况,我最喜欢的方法是设置链接服务器。然后使用openquery将数据从远程服务器获取到当前服务器上的临时表中。然后,您可以加入临时表。我会在存储过程中执行此操作。

作为最后的手段,您可以尝试使用应用程序代码将长列表分成一系列较短的列表。然后循环遍历这些较短的列表,一旦完成,您将汇总最终结果。然而,这是混乱的,这就是为什么它是最后的手段。