You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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条结果:

  1. 通配符拼接在子查询外:
SELECT * FROM Budget WHERE Budget.[EXPENSE_NAME] Like 
'*' & (SELECT COST_DISPLAY FROM CostType WHERE CODE_NAME = 'TEMP_EMPLOYEE') & '*'
  1. 通配符移入子查询:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:11:31