Ms access MS Access:如何设置此记录集。筛选器?
我有一个问题,我正试图找到解决办法 我有一张桌子,看起来像这样:Ms access MS Access:如何设置此记录集。筛选器?,ms-access,Ms Access,我有一个问题,我正试图找到解决办法 我有一张桌子,看起来像这样: @myTable id - Number value - Text models - Memo @myModels id - Number model - Text notes - Memo Dim sql As String sql = "SELECT * FROM myTable" Dim rs1 As Recordset Set rs1 = DBO.Edit (sql) sql = "SELECT model FROM
@myTable
id - Number
value - Text
models - Memo
@myModels
id - Number
model - Text
notes - Memo
Dim sql As String
sql = "SELECT * FROM myTable"
Dim rs1 As Recordset
Set rs1 = DBO.Edit (sql)
sql = "SELECT model FROM myModels"
dim rs2 As Recordset
Set rs2 = DBO.Read (sql)
If Not rs2.BOF Then rs2.MoveFirst
While Not rs2.EOF
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
Dim models() As String
models = Split(rs1![models], "|")
Dim model As String
For Each model In models
If model = rs2.model Then
'Do some processing
End If
Next model
rs1.MoveNext
Wend
rs2.MoveNext
Wend
While Not rs2.EOF
rs1.Filter( "Insert Regex Here" )
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
' Do Some Processing here
rs1.MoveNext
Wend
rs2.MoveNext
Wend
我还有一张类似这样的桌子:
@myTable
id - Number
value - Text
models - Memo
@myModels
id - Number
model - Text
notes - Memo
Dim sql As String
sql = "SELECT * FROM myTable"
Dim rs1 As Recordset
Set rs1 = DBO.Edit (sql)
sql = "SELECT model FROM myModels"
dim rs2 As Recordset
Set rs2 = DBO.Read (sql)
If Not rs2.BOF Then rs2.MoveFirst
While Not rs2.EOF
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
Dim models() As String
models = Split(rs1![models], "|")
Dim model As String
For Each model In models
If model = rs2.model Then
'Do some processing
End If
Next model
rs1.MoveNext
Wend
rs2.MoveNext
Wend
While Not rs2.EOF
rs1.Filter( "Insert Regex Here" )
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
' Do Some Processing here
rs1.MoveNext
Wend
rs2.MoveNext
Wend
@myTable.models值是用“|”字符连接的不同@myModels.model字符串的串联。例如,它可能有ModelA | ModelB | ModelC |或者只有ModelA | ModelC|
我需要根据当前选择的模型从@myTable中筛选记录集。现在我有这样的事情:
@myTable
id - Number
value - Text
models - Memo
@myModels
id - Number
model - Text
notes - Memo
Dim sql As String
sql = "SELECT * FROM myTable"
Dim rs1 As Recordset
Set rs1 = DBO.Edit (sql)
sql = "SELECT model FROM myModels"
dim rs2 As Recordset
Set rs2 = DBO.Read (sql)
If Not rs2.BOF Then rs2.MoveFirst
While Not rs2.EOF
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
Dim models() As String
models = Split(rs1![models], "|")
Dim model As String
For Each model In models
If model = rs2.model Then
'Do some processing
End If
Next model
rs1.MoveNext
Wend
rs2.MoveNext
Wend
While Not rs2.EOF
rs1.Filter( "Insert Regex Here" )
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
' Do Some Processing here
rs1.MoveNext
Wend
rs2.MoveNext
Wend
我真的希望能够在查询或过滤器中执行某种类型的正则表达式,因此它可能看起来像这样:
@myTable
id - Number
value - Text
models - Memo
@myModels
id - Number
model - Text
notes - Memo
Dim sql As String
sql = "SELECT * FROM myTable"
Dim rs1 As Recordset
Set rs1 = DBO.Edit (sql)
sql = "SELECT model FROM myModels"
dim rs2 As Recordset
Set rs2 = DBO.Read (sql)
If Not rs2.BOF Then rs2.MoveFirst
While Not rs2.EOF
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
Dim models() As String
models = Split(rs1![models], "|")
Dim model As String
For Each model In models
If model = rs2.model Then
'Do some processing
End If
Next model
rs1.MoveNext
Wend
rs2.MoveNext
Wend
While Not rs2.EOF
rs1.Filter( "Insert Regex Here" )
If Not rs1.BOF Then rs1.MoveFirst
While Not rs1.EOF
' Do Some Processing here
rs1.MoveNext
Wend
rs2.MoveNext
Wend
我想我的主要问题是@myModels表有大约1000条记录,而且还在增长,而@myTable表中有超过30k条记录。当多次尝试循环遍历每条记录时,循环遍历需要非常长的时间
任何解决方案都将不胜感激。您是否尝试过sql=“从myModels where criteria中选择模型”?
不确定当前选择的模型是什么意思,但可以使用临时变量添加临时字符串或其他任何需要的内容
也许加入你的sql?
您能否详细说明此模型来自何处,以及它所选的在VBA中对记录的迭代通常比单个SQL查询慢多少。使用VBA运行单个SQL查询比运行多个循环更快: 在VBA中: 诚然,这仍然会很慢,因为这是一个外部连接,并且因为我们使用了非优化的
LIKE
操作符
如果不使用myTable.models
字段,您可以添加一个中间表:
@myTableModels
tableID - number
modelID - number
通过正确的关系,生成的查询几乎是即时的:
SELECT myTable.*
FROM (myTable
INNER JOIN myTableModels
ON myTable.id = myTableModels.tableID)
INNER JOIN myModels
ON myTableModels.modelID = myModels.ID
Edit只返回带有dbOpenDynaset和dbSeeChanges选项的记录集,而DBO.Read只返回带有dbOpenSnapshot和dbReadOnly选项的记录集。