抱歉,MS Access 没有像CTE那样提供在递归模式下运行查询的功能。可以使用 VBA 宏来处理学生集合,将逗号分隔的值拆分为一组记录;)
比方说,你有表Student字段:
- ID(数字 - 整数),
- 学生(字符串 - 字符)
样本数据:
身份证学生
1 约翰、吉姆、约翰尼、汤姆、杰克
2 宝拉、罗伯特、蒂姆、多萝西
5 弗兰克、拉蒙娜、乔治奥、特蕾莎、芭芭拉
19 伊莎贝尔、伊芙、伊维琳娜、塔迪特
您需要创建另一个表来存储宏的结果。
创建表 CTE1
(
ID INT,
原始值 CHAR(255),
单值 CHAR(255),
余数 CHAR(255)
);
要添加宏,请执行以下步骤:
- 转到 Visual Basic 代码窗格
- 插入新模块
- 复制下面的代码并将其粘贴到之前添加的模块中
- 鼠标光标移动到 **ModifyMyData** 过程中,只要在其主体内单击即可
- 运行代码 (F5)
选项比较数据库
选项显式
'需要参考 Microsoft ActiveX 数据对象 2.8 库
子 ModifyMyData()
将 sSQL 作为字符串变暗
暗淡为 ADODB.Recordset
将 vArray 调暗为变体
将 i 调暗为整数
'清除CTE表
sSQL = "删除 * 从 CTE;"
CurrentDb.Execute sSQL
'初始查询
sSQL = "插入 CTE (ID、OrigValue、SingleValue、余数)" & vbCr & _
“选择 ID,学生作为 OrigValue,TRIM(LEFT(学生,InStr(1,Students,',')-1)) 作为 SingleValue,” & _
"TRIM(RIGHT(Students,LEN(Students)-InStr(1,Students,','))) 作为余数" & vbCr & _
“来自学生;”
CurrentDb.Execute sSQL
sSQL = "SELECT ID、OrigValue、SingleValue、余数" & vbCr & _
“来自 CTE”
设置 rst = 新 ADODB.Recordset
rst.Open sSQL、CurrentProject.Connection、adOpenStatic
与第一
'填充第一个对象
.MoveLast
.MoveFirst
'通过
不在时做 rst.EOF
'将余数拆分为数组
vArray = Split(.Fields("Remainder"), ",")
'添加每一个值
对于 i = LBound(vArray) 到 UBound(vArray)
sSQL = "插入 CTE (ID、OrigValue、SingleValue、余数)" & vbCr & _
"VALUES(" & .Fields("ID") & ", '" & .Fields("OrigValue") & "','" & vArray(i) & "','" & GetRemainder(vArray, i + 1 ) & "');"
CurrentDb.Execute sSQL
下一个
.MoveNext
环形
。关
结束于
设置 rst = 无
MsgBox "准备好了!"
DoCmd.OpenTable "CTE"
结束子
函数 GetRemainder(vList As Variant, startpos As Integer) As String
将 i 调暗为整数,将 sTmp 调为字符串
For i = startpos To UBound(vList)
sTmp = sTmp & vList(i) & ","
下一个
如果 Len(sTmp) > 0 则 sTmp = Left(sTmp, Len(sTmp) - 1)
GetRemainder = sTmp
结束功能