实现快速用户界面通配符文本搜索(MS Access)的最佳方法是什么?

时间:2016-07-29 15:45:13

标签: sql ms-access

我在表中有几个字段,我希望用户能够使用通配符进行搜索。我真正想要的是一种进行通配符搜索的方法,以促进公平的用户体验(例如,不笨重;速度不错;如果不快,那么可能在后台进行处理)。我知道通配符搜索是不受欢迎的;如果没有可行的解决方案,我甚至可能会废弃此功能。我想提一下,我正在寻找更多的想法,而不是寻找具体的代码。

这是一个示例,显示我到目前为止所尝试的内容。考虑这个假设表,其中3个字段包含文本(此表的目的无关紧要):

tableWidget

ID     |     Field1     |     Field2     |     Field3    |
1      | jimmy john     | waldo johnson  | carmen smith  |
2      | francis        | david smith    | NULL          |
3      | yvonne         | harry t.       | mr. waldo     |
4      | dr. waldo, md  | hal            | NULL          |

所以我想找到所有有" waldo"在里面。我的第一个预感是做这样的事情:

SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE ID IN
(
  SELECT ID FROM tableWidget WHERE
  Field1 LIKE '*waldo*' OR
  Field2 LIKE '*waldo*' OR
  Field3 LIKE '*waldo*'
)

这里的问题是,随着我正在运行的记录数量,它非常慢。我做的第二次尝试是这样的:

SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE ID IN
(
  SELECT ID FROM tableWidget 
  WHERE  Field1 & Field2 & Field3 LIKE '*waldo*'
)

这仍然很慢。我试过的第三种方法是让一个Form_Timer事件循环通过tableWidget并进行VBA比较。我的表单记录集是这样的:

SELECT * FORM tableWidget
WHERE ID IN (SELECT * FROM tempTable)

附加到磁带的代码片段看起来像这样"

With rsTableWidget
  If Searching=True AND NOT .EOF Then

    If INSTR(.Fields("Field1") & .Fields("Field2") & ".Fields("Field3"), "waldo") > 0 Then
      rsTempTable.AddNew
      rsTempTable.Fields("ID")=.Fields("ID")
      rsTempTable.Update
      mySubForm.Requery
    End If

    rsTableWidget.MoveNext

  Else

    Searching=False
    rsTableWidget.Close: rsTempTable.Close

  End If
End With

关于这一点的好处是它会在后台更新。关于这个的坏处是Form_Timer的每次迭代都会闪烁。当它找到一条记录时,mySubForm.requery方法会重置表单 - 不是非常用户友好。

我考虑过的其他方法是使用VBA代码定期解析每个单词(用空格分隔)并创建一个搜索表:

tableSearchTerm

ID    |    searchTerm
1     |    jimmy
1     |    john
1     |    waldo
1     |    johnson
1     |    carmen
1     |    smith
2     |    francis
2     |    david
2     |    smith
etc...

我还没有尝试过这个,但我想好的事情是我可以索引searchTerm。而且我不再需要使用通配符,因为所有条款都与ID相关联。不好的是,这张桌子会变得非常快!

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您的查询看起来过于复杂,为什么不使用它?

SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE 
  Field1 LIKE '*waldo*' OR
  Field2 LIKE '*waldo*' OR
  Field3 LIKE '*waldo*'

但是,在搜索字词的开头处使用通配符进行全文搜索会很慢,因为无法使用索引。

您可能希望将后端迁移到服务器数据库,具有全文搜索功能。例如。 SQL Server

此Q& A表示它也适用于Express版:Express with Advanced Services, can't create Full Text Index

如果这不是一个选项,我建议让用户选择

  • 搜索字段的开头(Field1 LIKE 'waldo*'),如果您对字段编制索引会更快,或者
  • 进行慢速全文搜索。

这取决于您的数据。对于名称,例如,第一个选项几乎总是足够的。