1

我的项目包含一个 MS Acces 2003 数据库,数据库中的表包含一个名为学生姓名的列。单列包含 n 个学生姓名。例如。John、Jim、Johny、Tom 等。它们是动态添加的。现在我想要的是,我想要列中所有名称的完整列表。就像例如。如果该列是

Student_name

John, Jim, Johny, Tom, Jack

我想要输出为:

Student_name

John
Jim
Johny
Tom
Jack

查询必须支持 MS Access。当我在 html 文件中获取数据并将该 html 文件附加到 MS Aacess 数据库时

4

1 回答 1

0

抱歉,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

结束功能
于 2013-12-29T12:03:36.403 回答