MS Access:如何将子查询结果用于带通配符的LIKE条件?
问题场景
原查询可正常返回40余条匹配结果:
SELECT * FROM Budget WHERE Budget.[EXPENSE_NAME] Like '*Temps/Seasonal Employees*'
为避免硬编码可变的显示名称(后续名称修改时需更新多个查询),希望通过CostType表中稳定的CODE_NAME获取目标显示名称。已知以下子查询仅返回单条结果Temps/Seasonal Employees:
SELECT COST_DISPLAY FROM CostType WHERE CODE_NAME = 'TEMP_EMPLOYEE'
但尝试将子查询代入原查询的两种写法均返回0条结果:
- 通配符拼接在子查询外:
SELECT * FROM Budget WHERE Budget.[EXPENSE_NAME] Like '*' & (SELECT COST_DISPLAY FROM CostType WHERE CODE_NAME = 'TEMP_EMPLOYEE') & '*'
- 通配符移入子查询:
SELECT * FROM Budget WHERE Budget.[EXPENSE_NAME] Like (SELECT '*' & COST_DISPLAY & '*' FROM CostType WHERE CODE_NAME = 'TEMP_EMPLOYEE')
在子查询中添加TOP 1后仍无效果。
可行解决方案
方法1:使用DLookup函数替代子查询
Access的DLookup函数专为单条记录的字段值查询设计,直接拼接通配符即可实现需求:
SELECT * FROM Budget WHERE Budget.[EXPENSE_NAME] Like '*' & DLookup("COST_DISPLAY", "CostType", "CODE_NAME = 'TEMP_EMPLOYEE'") & '*'
方法2:通过JOIN关联表
将Budget表与CostType表关联,绕过子查询的语法限制:
SELECT b.* FROM Budget b INNER JOIN CostType ct ON b.[EXPENSE_NAME] Like '*' & ct.COST_DISPLAY & '*' WHERE ct.CODE_NAME = 'TEMP_EMPLOYEE'
如果COST_DISPLAY可能包含通配符特殊字符(如*或?),可通过Replace函数转义避免匹配异常:
SELECT b.* FROM Budget b INNER JOIN CostType ct ON b.[EXPENSE_NAME] Like '*' & Replace(Replace(ct.COST_DISPLAY, '*', '[*]'), '?', '[?]') & '*' WHERE ct.CODE_NAME = 'TEMP_EMPLOYEE'
方法3:创建中间查询对象
先新建查询qry_TempEmployeePattern:
SELECT '*' & COST_DISPLAY & '*' AS SearchPattern FROM CostType WHERE CODE_NAME = 'TEMP_EMPLOYEE'
再在主查询中引用该中间查询:
SELECT * FROM Budget WHERE Budget.[EXPENSE_NAME] Like (SELECT SearchPattern FROM qry_TempEmployeePattern)
内容的提问来源于stack exchange,提问作者Aufgeschissener Kunde
相关产品推荐
相关产品推荐

