MS Access:如何设置Recordset.Filter过滤器?

时间:2012-12-04 14:48:20

标签: ms-access

我有一个问题,我正在尝试找到解决方案。

我有一张桌子,它看起来像这样:

@myTable
id - Number
value - Text
models - Memo

我还有一个看起来像这样的表:

@myModels
id - Number
model - Text
notes - Memo

@ myTable.models值是与'|'连接的不同@ myModels.model字符串的串联字符。例如,它可能有ModelA | ModelB | ModelC |或仅限ModelA | ModelC |

我需要根据当前选择的模型从@myTable过滤记录集。现在我有这样的事情:

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表中有超过30,000条记录。当尝试多次遍历每个记录时,这需要很长的时间来循环。

非常感谢任何解决方案。

2 个答案:

答案 0 :(得分:0)

你试过sql =“SELECT model FROM myModels where criteria”吗? 不确定您当前所选模型的含义,但您可以使用tempVars添加临时字符串或您需要的任何其他内容 也许加入你的SQL? 你能详细说明这个模型来自哪里以及如何选择

答案 1 :(得分:0)

迭代VBA中的记录通常比单个SQL查询慢。运行单个SQL查询比使用VBA的多个循环更快:

SELECT myTable.*
FROM myTable, myModels
WHERE myTable.models LIKE "%" & myModels.model & "%"

在VBA中:

Dim sql As String, rs As Recordset
sql = _
      "SELECT * " & _
      "FROM myTable, myModels " & _
      "WHERE myTable.models LIKE ""*"" & myModels.model & ""*"""

Set rs = dbs.OpenRecordset(sql)
While Not rs.EOF
      'Some processing here
Loop

不可否认,这仍然会很慢,因为这是一个外部联接,因为我们使用的是非优化的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
相关问题