2016-07-29 55 views
3

我在表中有幾個字段,我希望用戶能夠使用通配符進行搜索。我真正需要的是一種通用搜索方法,它可以促進良好的用戶體驗(例如,不笨重;體面的速度;如果速度不快,則可能在後臺處理)。我知道通配符搜索是不受歡迎的。如果沒有可行的解決方案,我甚至可能會廢棄這個功能。我想提一下,我正在尋找更多的想法,而不是尋找特定的代碼。實現快速用戶界面通配符文本搜索(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   | 

所以我想找到它擁有「金都」的所有記錄。我的第一直覺是做這樣的事情:

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代碼定期通過ev進行解析ERY字(用空格分隔),並創建一個搜索表:

tableSearchTerm

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

我沒有試過,但我想的好東西將是我能指數SEARCHTERM 。而且我不必再使用通配符,因爲所有術語都與ID關聯。壞事是這張桌子會變得很快!

有沒有更好的方法?

+0

我沒有看到使用通配符有什麼問題 - 它是您的情況所必需的,所以有其他選擇。如果你不得不在三個帶有OR的文本字段上進行操作,那麼速度方面就不會太多。就我個人而言,我沒有看到使用定時器的好處。你可以嘗試索引這三個字段 - 但是在你的seacrh術語的兩邊使用通配符,我不確定這是否會有所幫助。 – dbmitch

+0

P.S.你的記錄數是多少,什麼是「極其緩慢」? – Andre

回答

1

您的查詢看起來過於複雜,爲什麼不使用它?

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

但是,是的,使用通配符全文檢索在開始搜索項的,將是緩慢的,因爲沒有任何指標都可以使用。

您可能希望將遷移到服務器數據庫作爲後端,它具有全文搜索功能。例如。 SQL Server

這個問答&一說,這還與Express版本:Express with Advanced Services, can't create Full Text Index

如果這是不是一種選擇,我建議讓用戶選擇

  • 領域的搜索起點() ,如果您對字段進行索引,這會更快,或者執行緩慢的全文本搜索。

這取決於您的數據。對於名稱,例如,第一個選項幾乎總是足夠的。

+0

感謝您的信息。我決定創建VBA代碼來創建一個searchQuery和一個searchTable(它具有索引搜索條件)。代碼同步它們以確保它們始終是相同的。最初的構建很長,但更新它的代碼很快。而且我使用了關於最後只使用星號通配符的建議。它顯着更快。所以最終它是使用索引字段和適當的通配符用法的組合。謝謝。 – user2271875

相關問題