admin

在何处子句中选择具有许多离散值的选择

sql

给定一个像表

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的局限性,我通过形成类别代码的范围来解决该局限性。不幸的是,这只能解决问题,因为可以传递给SQL
Server的查询的大小受到限制。

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

是否有解决此问题的更优雅和/或更有效的解决方案?


阅读 135

收藏
2021-06-07

共1个答案

admin

您的第一个直觉是正确的,因此您可能会发现一个足以代替临时表的表值变量。不必担心这种情况下的性能;不会很重要。如有需要,总可以在临时表上创建索引,但这似乎有点麻烦。在CategoryId字段上有索引吗?

2021-06-07