C# 如何编写选择列值等于多个值之一的行的SQL请求?

C# 如何编写选择列值等于多个值之一的行的SQL请求?,c#,.net,sql,sql-server,azure-sql-database,C#,.net,Sql,Sql Server,Azure Sql Database,我有一个SQL Azure数据库,其中的表具有JobId主键。用户以数组的形式发送一组作业ID,该数组可以包含一个或多个值,可能是十个,可能是一万个。我无法决定如何为此编写SQL查询。我将使用.NETFramework类 我看到的一个选项是创建一个临时表,并在嵌套的SELECT SQL+C类伪代码中执行WHERE操作: CREATE TEMP TABLE JobIdsTable foreach( JobId in JobIdsFromClients ) { INSERT INTO JobI

我有一个SQL Azure数据库,其中的表具有JobId主键。用户以数组的形式发送一组作业ID,该数组可以包含一个或多个值,可能是十个,可能是一万个。我无法决定如何为此编写SQL查询。我将使用.NETFramework类

我看到的一个选项是创建一个临时表,并在嵌套的SELECT SQL+C类伪代码中执行WHERE操作:

CREATE TEMP TABLE JobIdsTable
foreach( JobId in JobIdsFromClients ) {
   INSERT INTO JobIdsTable VALUES (JobId)
}
SELECT * FROM JobsTable WHERE JobId IN SELECT * FROM JobIdsTable
从代码编写的角度来看,它看起来很酷,但我不确定它是否总是运行得很快

另一个选项是创建一个巨大的或串联的,形成一个巨大的选择:

这里是一个SELECT,但是连接这个longs字符串的想法听起来不太好,通常我会用它来构建一个参数化查询,但是在这里它会非常复杂。我也不确定SQL查询的长度是否有限制

我希望我的查询既可管理又可执行。因此,我认为这两种选择都有缺点


我选择哪一个?我可以用其他方法吗?

我会使用temp表,但使用联接而不是子查询。如果Id列已编制索引,则性能应良好:

SELECT * 
FROM JobsTable j
INNER JOIN JobIdsTable jt ON j.JobId = jt.JobId

我会使用临时表,但使用联接而不是子查询。如果Id列已编制索引,则性能应良好:

SELECT * 
FROM JobsTable j
INNER JOIN JobIdsTable jt ON j.JobId = jt.JobId

JobID从何而来,我无法想象ID来自一个用户键入10000个整数的表单

理想情况下,您需要的是某种将ID分组在一起的JobBatch表,可以通过job表上的JobBatchId FK,也可以通过中间JobBatchId表,如果存在多对多,则将作业批与作业关联。然后,生成id的任何东西只需生成一个批,您只需传入一个id


通过将逗号分隔的is列表作为单个参数传入,然后在SP中将其拆分出来,可以解决此问题,但多达10000个,这是一个糟糕的设计。是一个拆分函数的集合,以防您希望沿着这条路线前进。

作业ID来自何处,我无法想象ID来自一个用户键入10000个整数的表单

理想情况下,您需要的是某种将ID分组在一起的JobBatch表,可以通过job表上的JobBatchId FK,也可以通过中间JobBatchId表,如果存在多对多,则将作业批与作业关联。然后,生成id的任何东西只需生成一个批,您只需传入一个id


通过将逗号分隔的is列表作为单个参数传入,然后在SP中将其拆分出来,可以解决此问题,但多达10000个,这是一个糟糕的设计。是一个拆分函数的集合,以防您希望执行此操作。

您可以连接一长串ID而不是OR,并使用WHERE in子句,如:

SELECT * FROM JobsTable WHERE JobId IN (12343,454353,24354,20200/*,...so on...*/)
这是一个快速构建和轻量级管理的sql server


如果希望如3939所示,IN语法只能接受一个值,如果希望脏解决方案不检查cero基数,则可以开始用0连接,并添加尽可能多的“,“+IDvalue(根据需要)和final(如果0不是有效的JobId)

您可以连接一长串ID,而不是OR,并使用WHERE IN子句,如:

SELECT * FROM JobsTable WHERE JobId IN (12343,454353,24354,20200/*,...so on...*/)
这是一个快速构建和轻量级管理的sql server


如果希望如3939所示,IN语法只能接受一个值,如果希望脏解决方案不检查cero基数,则可以开始用0连接,并添加尽可能多的“,“+IDvalue(根据需要)和一个最终值,前提是0不是有效的JobId

大约需要多少JobId?@Sam:列表将由软件生成,该软件将由其他人编写,因此我真的不知道-它可以是任何内容。大约需要多少JobId?@Sam:列表将是软件生成,软件将由其他人编写,所以我真的不知道-它可以是任何东西。一个建议是使用表变量而不是临时表,这将是一个更轻量级的解决方案,我在实践中发现,查询优化程序将为连接和连接生成相同的执行计划,其中在连接中性能将相同。这是因为select语句只定义了一个集合,而不指定如何检索数据。@Ben:没错,但是一个可能包含数千个值的IN将非常笨拙@StevieG如果它是一个in语句,如1,2,3中所述,则您是正确的,项目数量有限制,但如果它是select语句,则可以。一个建议是使用table变量而不是临时表,这将是一个更轻量级的解决方案,我在实践中发现,查询优化程序将为连接和连接生成相同的执行计划,其中在连接中性能将相同。我是贝考
select语句只定义了一个集合,它并不指定如何检索数据。@Ben:这是公平的,但是一个可能包含数千个值的IN将非常笨拙@StevieG您是对的,如果它是一个in语句,如1,2,3中所述,则项目数量有限制,但如果它是select语句,则可以。