MS Access查询以分隔逗号

时间:2013-05-27 10:53:16

标签: html ms-access

我的项目包含一个MS Acces 2003数据库,数据库中的表包含一个名为学生名称的列。单列包含n个学生名称。例如。约翰,吉姆,约翰尼,汤姆等。他们是动态添加的。现在我想要的是,我想要列中所有名称的完整列表。 喜欢例如。如果列是

Student_name

John, Jim, Johny, Tom, Jack

我希望输出为:

Student_name

John
Jim
Johny
Tom
Jack

查询必须支持MS Access。因为我正在获取html文件中的数据,我已将该html文件附加到MS Aacess数据库

1 个答案:

答案 0 :(得分:0)

很抱歉,但MS Access不提供以递归模式运行查询的功能CTE。可以使用VBA宏继续学生收集,将逗号分隔值拆分为一组记录;)

比方说,你有表学生的字段:

  • ID(数字 - 整数),
  • 学生(字符串 - 字符)

示例数据:

Id Students
1   John, Jim, Johny, Tom, Jack
2   Paula, Robert, Tim, Dorothy
5   Frank, Ramona, Giorgio, Teresa, Barbara
19  Isabell, Eve, Ewelina, Tadit

您需要创建另一个表来存储宏的结果。

CREATE TABLE CTE1
(
    ID INT,
    OrigValue CHAR(255),
    SingleValue CHAR(255),
    Remainder CHAR(255)
);

要添加宏,请执行以下步骤:

  • 转到Visual Basic代码窗格
  • 插入新模块
  • 复制下面的代码并将其粘贴到以前添加的模块
  • 通过在其正文中单击
  • ,将鼠标光标移动到** ModifyMyData **过程
  • 运行代码(F5)
Option Compare Database
Option Explicit

'need reference to Microsoft ActiveX Data Object 2.8 Library

Sub ModifyMyData()
Dim sSQL As String
Dim rst As ADODB.Recordset
Dim vArray As Variant
Dim i As Integer

'clear CTE table
sSQL = "DELETE * FROM CTE;"
CurrentDb.Execute sSQL

'initial query
sSQL = "INSERT INTO CTE (ID, OrigValue, SingleValue, Remainder)" & vbCr & _
    "SELECT ID, Students AS OrigValue, TRIM(LEFT(Students, InStr(1,Students,',')-1)) AS SingleValue, " & _
                "TRIM(RIGHT(Students,LEN(Students)-InStr(1,Students,','))) AS Remainder" & vbCr & _
    "FROM Student;"
CurrentDb.Execute sSQL

sSQL = "SELECT ID, OrigValue, SingleValue, Remainder" & vbCr & _
    "FROM CTE"
Set rst = New ADODB.Recordset
rst.Open sSQL, CurrentProject.Connection, adOpenStatic
With rst
    'fill rst object
    .MoveLast
    .MoveFirst
    'proccess through the
    Do While Not rst.EOF
        'Split Remainder into array
        vArray = Split(.Fields("Remainder"), ",")
        'add every single value
        For i = LBound(vArray) To UBound(vArray)
            sSQL = "INSERT INTO CTE (ID, OrigValue, SingleValue, Remainder)" & vbCr & _
                "VALUES(" & .Fields("ID") & ", '" & .Fields("OrigValue") & "','" & vArray(i) & "','" & GetRemainder(vArray, i + 1) & "');"
            CurrentDb.Execute sSQL
        Next
        .MoveNext
    Loop
    .Close
End With

Set rst = Nothing

MsgBox "Ready!"

DoCmd.OpenTable "CTE"

End Sub


Function GetRemainder(vList As Variant, startpos As Integer) As String
Dim i As Integer, sTmp As String
For i = startpos To UBound(vList)
    sTmp = sTmp & vList(i) & ","
Next

If Len(sTmp) > 0 Then sTmp = Left(sTmp, Len(sTmp) - 1)
GetRemainder = sTmp

End Function