从其中 ID 中选择(我的程序的数组)
Posted
技术标签:
【中文标题】从其中 ID 中选择(我的程序的数组)【英文标题】:Select from where ID in (an array of my program) 【发布时间】:2014-04-12 06:40:06 【问题描述】:我想根据它的 ID 从我的表中获取项目列表。我需要选择的 ID 列表包含在我的程序的数组或字典中。
所以不要使用大量查询:
从 ID=1 的 tblData 中选择 *
从 ID=3 的 tblData 中选择 *
从 ID=9 的 tblData 中选择 *
从 ID=15 的 tblData 中选择 *
...(这里有数千条记录)Select * from tblData where ID=50000
从 ID=50100 的 tblData 中选择 *
由于需要运行许多查询,因此性能非常糟糕。还有其他更聪明的方法吗?
【问题讨论】:
使用 sql join 获得连击性能。 你在不同的桌子上有这个特定的列表吗? @Angel_Boy 不,它只是存储在我的程序数组中。因为用户通过突出显示从我的程序中选择要显示的记录。 【参考方案1】:在Where
条件下使用In
。
Dim sIDs As String
For Each sID As String In dic.Keys
sIDs += sID + ","
Next
'Remove last comma
sIDs = sIDs.Substring(0,sIDs.Length-1)
Dim sql As String = "Select * from tblData where ID In (" + sIDs + ")"
现在您可以使用 sql 适配器执行此 sql 并填充数据表
如果值存储在数组中,那么您可以使用 String.Join 并将其放在带有 in 语句的 sql 查询中。
Dim sIDs As String = String.Join(",", arrID)
Dim sql As String = "Select * from tblData where ID In (" + sIDs + ")"
【讨论】:
一行For Each
是有效的vb.net代码吗?或者关闭Next
需要添加
感谢@Fabio 指出更正。需要添加下一个。
@Nimesh 谢谢你的回答,我花了大约 8 秒的时间来选择 17000 个项目和你的解决方案。如果我选择所有表格并与字典进行比较,则只需 3 秒。所以你的答案现在也不是更好。
你使用的是字典还是数组?
这也取决于您的数据结构。您在您的表上创建了什么类型的索引以及您当前使用什么方法。请在您的问题中提及。【参考方案2】:
不要使用Select *
,而是使用显式列而不是Select Column1, Column2
...
根据您的表/数据库结构和数据,您可能会在尝试不同的解决方案时获得一些速度:
使用 WHERE ID BETWEEN min_sId AND max_sId
选择所有记录(因此您对 Id 有一个限制过滤器),然后排除您不需要的记录。 (我可能会使用这个解决方案)
使用临时表,您首先在其中插入 ID,然后在临时表上使用 INNER JOIN
从 tblData 中进行选择(我认为不会更快,因为您需要插入所有 ID在加入之前的表格中)
如果我的用户可以选择 50.000 个元素,我也会考虑更改界面的逻辑,这听起来不太对劲。
【讨论】:
以上是关于从其中 ID 中选择(我的程序的数组)的主要内容,如果未能解决你的问题,请参考以下文章