MS Access VBA运行关联SQL查询 从首个记录集取最小ID的语句修正问题
你原来的写法错误原因是SQL语句无法识别VBA中定义的Recordset对象rs0,不能直接把VBA对象当作SQL的查询源使用,有两种可行的修正方案:
方案1:将strSQL0作为子查询嵌套,一步得到最小ID
这种方法不需要额外打开rs0,直接合并两个SQL逻辑,执行效率更高:
' 合并后的查询直接取符合条件的最小Id strSQL = "SELECT MIN(t.Id) AS New_SubjectID " _ & "FROM (" _ & "SELECT Promis_lt_generating_numbers_SubjectID_step2.* " _ & "FROM Promis_lt_generating_numbers_SubjectID_step2 LEFT JOIN PROMIS_LT ON Promis_lt_generating_numbers_SubjectID_step2.[Id] = PROMIS_LT.[DadosID] " _ & "WHERE PROMIS_LT.DadosID Is Null" _ & ") AS t;" ' 执行查询获取结果 Set rs = dbs.OpenRecordset(strSQL) newSubjectID = rs!New_SubjectID rs.Close
方案2:直接操作已打开的rs0记录集取最小值
如果你的业务逻辑必须先拿到完整的rs0记录集再处理,不需要再写额外的SQL,直接操作记录集即可:
strSQL0 = "SELECT Promis_lt_generating_numbers_SubjectID_step2.* " _ & "FROM Promis_lt_generating_numbers_SubjectID_step2 LEFT JOIN PROMIS_LT ON Promis_lt_generating_numbers_SubjectID_step2.[Id] = PROMIS_LT.[DadosID] " _ & "WHERE PROMIS_LT.DadosID Is Null;" Set rs0 = dbs.OpenRecordset(strSQL0) ' 先判断是否存在符合条件的记录 If rs0.EOF And rs0.BOF Then ' 无匹配记录时的自定义处理逻辑 newSubjectID = 0 Else ' 按Id升序排序后第一条就是最小Id rs0.Sort = "Id ASC" rs0.MoveFirst newSubjectID = rs0!Id End If rs0.Close
注意:拼接SQL语句时要注意关键字前后留空格,避免上下句拼接后出现语法错误,上述代码已经调整了空格格式。
内容的提问来源于stack exchange,提问作者Ruva
相关产品推荐
相关产品推荐

