sql - 在Where 子句中选择可能存在的许多离散值

标签 sql sql-server

给定一个像这样的表格

CREATE TABLE [dbo].[Article](
    [Id] [int] NOT NULL,
    [CategoryId] [int] NOT NULL,
    [Text] [nchar](10) NOT NULL)

用户可以选择一个或多个他们想要查看数据的类别。通常他们会选择 1-20 个类别。为了适应这一点,我生成了类似于以下内容的参数化查询:

SELECT * FROM Article
WHERE CategoryId IN (@c1, @c2, @c3, @c4, @c5)

但是,在一些罕见的用例中,用户可以合法地选择数百个类别。这让我发现了 Linq-to-Entities 的局限性,我通过形成 ranges of category codes 来解决这个问题。 。不幸的是,这只能解决这个问题,因为可以传递到 SQL Server 的查询的大小是有限的。

我想重构此查询以避免任何硬限制。我的第一个想法是创建一个包含所请求类别的临时表,并对该临时表执行内部联接来代替 IN(...) 子句。但是,我知道临时表可能会非常慢。

是否有更优雅和/或性能更好的解决方案来解决这个问题?

最佳答案

您的第一直觉是正确的,尽管您可能会发现表值变量足以代替临时表。不要担心这种情况下的性能;这不会有什么重大意义。如果需要的话,总是可以在临时表上创建索引,但这似乎不太可能。 CategoryId 字段上有索引吗?

关于sql - 在Where 子句中选择可能存在的许多离散值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146978/

相关文章:

c# - SQL 服务器 : Rethrow exception with the original exception number

mysql - 计数大多数捐赠者 SQL

c# - 如何从内部保护系统(如内部工作)?

sql - 连接顺序如何影响查询性能

sql-server - 可复制的 Coldfusion SQL 异常

mysql - 在 MySQL 的一个查询中使用不同值更新多行

sql - 如何从 MySQL 中的选择中删除?

mysql - 将 MIN() 函数与 INNER JOIN 结合使用

sql-server - SQL Server 和 Oracle 等产品是 "ORDBMS"的示例吗?

sql-server - 如何使用 SQL 查询在 SQL Server 2008 R2 中获取用户定义的类型定义?