创建对Id列进行严格过滤的查询的最佳方法是什么?

本文关键字:查询 最佳 方法 是什么 过滤 Id 创建 | 更新日期: 2023-09-27 18:05:08

在我的应用程序中,我将不得不使用许多动态查询,在这些查询中,我必须只选择按其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子句中允许的若干项的限制…

要实现这种过滤,最好的机制是什么?

我想使用一个staging表来插入id,然后在进行数据查询时使用与这个表的连接,但我不确定在这个staging表中总是删除和插入的性能,此外,id列表依赖于用户,因此User1可能正在执行id 1-200的查询,而User2正在执行id 201-500的查询。

谢谢

创建对Id列进行严格过滤的查询的最佳方法是什么?

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

有关更多信息,请参阅MSDN文章表值参数

也许使用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 

祝你今天愉快!

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

query 1
select id 
from table1
where whatever

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

与同一数据库中的两个表。换句话说,提问者不知道如何连接表。

这可能不是这里的情况,因为@ibiza在最后一段提到了join tables。这表明有不止一个数据库在起作用。如果它们位于同一台服务器上,处理这种情况的更好方法是获得适当的权限并用数据库名称限定表。像这样:

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

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

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