我正在使用Access在数据库中使用多个(大约18个)标准进行搜索。所有这些标准需要结合起来才能产生正确的结果。搜索查询被评估为过于复杂。
在查询中,我使用填写的搜索字段(临时变量)来查找与所有搜索字段匹配的联系人。
该查询如下所示:
SELECT
Contacts.ID,
Contacts.[Naam Contact],
Contacts.Adresgegevens,
Nz([Contacts]![Type Opleiding]) AS [Type opleiding],
Contacts.OplGetal,
Contacts.DataCV,
Nz([Contacts]![Datum Sollicitatie],
DateSerial(1901,1,1)) AS [Datum Sollicitatie],
Contacts.LaatstGewijzigd,
Contacts.Voornaam,
Contacts.Achternaam,
Contacts.Medewerker,
Contacts.Zoektermen,
Contacts.Woonplaats,
Contacts.Geboortejaar,
Contacts.[A],
Contacts.[B],
Contacts.[C],
Contacts.D,
Contacts.E,
Contacts.Overig,
Year(Now())-[Geboortejaar]-1 & "/" & Year(Now())-[Geboortejaar] AS Leeftijd,
Contacts.BinnengekomenBij,
Contacts.Categorie,
Contacts.BinnenBuiten
FROM
Contacts
WHERE
Contacts.[Naam Contact] Like "*" & TempVars!tmpNaam & "*"
And Contacts.Adresgegevens Like "*" & TempVars!tmpAdres & "*"
And Nz(Contacts![Type Opleiding]) Like "*" & TempVars!tmpOpleiding & "*"
And Contacts.OplGetal > TempVars!tmpHGO-1
And Nz(Contacts![Datum Sollicitatie],DateSerial(1901,1,1)) > DateValue(TempVars!tmpDatumSol)
And ( TempVars!tmpBiBu = Contacts.BinnenBuiten
Or TempVars!tmpBiBu = "Maakt niet uit" )
And (TempVars!tmpOP=No Or Contacts.[A]=Yes)
And (TempVars!tmpSP=No Or Contacts.[B]=Yes)
And (TempVars!tmpSS=No Or Contacts.[C]=Yes)
And (TempVars!tmpINS=No Or Contacts.D=Yes)
And (TempVars!tmpE=No Or Contacts.E=Yes)
And (TempVars!tmpOverig=No Or Contacts.Overig=Yes)
And (TempVars!tmpMed=No Or Contacts.Medewerker=Yes)
And (Nz(Contacts.BinnengekomenBij) Like "*" & TempVars!tmpBin & "*"
And (TempVars!tmpCat=Contacts.Categorie Or TempVars!tmpCat="Beide")
如何使此查询更智能,更简单?
提前致谢!
答案 0 :(得分:0)
我用来解决这类错误的方法是首先将大多数选定的字段放在注释中,包括在WHERE子句中,然后逐个添加一个,然后运行查询。最终你会找到造成复杂结果的那个。如果我的记忆正确地为我服务,我认为它是由Nz功能引起的。
答案 1 :(得分:0)
我已经解决了我的问题! 复杂性来自我检查过的所有复选框,例如:
(TempVars!tmpE=No Or Contacts.E=Yes)
由于所有这些复选框的组合,查询最终看起来像这样: http://www.blueclaw-db.com/accessquerysql/complex_query.gif
解决方案是将所有内容放在VBA代码中并动态构建查询。现在,只有在选中时,查询中才会包含一个复选框(附加到查询中)。有关复选框E的代码段:
If Me.checkboxE = True Then
strSQL = strSQL + "And Contacts.E=Yes "
End If
这消除了查询的复杂性,现在一切运行顺利!