基于Between的Join查询实现求助:曾实现过但遗忘方法
基于BETWEEN的关联查询与DLookup正确实现方案
一、SQL JOIN 查询的正确写法
你之前的SQL语句本身是可行的,只需注意Access(从DLookup判断是Access环境)的语法细节:
SELECT tblMyData.ID, tblMyData.LineNum, tblBudgetRange.[Budget Name] FROM tblMyData INNER JOIN tblBudgetRange ON tblMyData.LineNum BETWEEN tblBudgetRange.fromLine AND tblBudgetRange.toLine;
- 字段名带空格(比如
[Budget Name])必须用方括号包裹,其他无特殊字符的字段可直接使用。 - 若要保留所有
tblMyData记录(哪怕无匹配预算区间),将INNER JOIN替换为LEFT JOIN即可。
二、DLookup函数的正确用法
你之前的DLookup存在字符串拼接逻辑错误,正确写法分两种场景:
1. Access查询的计算字段中使用
BudgetName: DLookUp("[Budget Name]", "tblBudgetRange", "[LineNum] BETWEEN [fromLine] AND [toLine]")
2. VBA代码中使用
如果需要基于当前记录的LineNum查询:
Dim targetLine As Long targetLine = Me.LineNum ' 假设从窗体控件获取当前行号 Dim resultName As String resultName = DLookUp("[Budget Name]", "tblBudgetRange", _ "[LineNum] BETWEEN [fromLine] AND [toLine] AND [LineNum] = " & targetLine)
注意:DLookup仅返回第一条匹配记录,若存在重叠区间,建议优先用SQL JOIN获取所有匹配结果,性能也更优。
三、常见坑点排查
- 数据类型一致:
LineNum、fromLine、toLine必须为相同数值类型(如整数、长整数),否则BETWEEN比较会失效。 - 区间重叠问题:若
tblBudgetRange存在重叠区间,JOIN会返回多条匹配记录,DLookup仅取第一条,需根据业务需求调整。 - 拼写检查:表名、字段名必须完全匹配,带空格的字段务必加方括号。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

