我的项目包含一个MS Acces 2003数据库,数据库中的表包含一个名为学生名称的列。单列包含n个学生名称。例如。约翰,吉姆,约翰尼,汤姆等。他们是动态添加的。现在我想要的是,我想要列中所有名称的完整列表。 喜欢例如。如果列是
Student_name
John, Jim, Johny, Tom, Jack
我希望输出为:
Student_name
John
Jim
Johny
Tom
Jack
查询必须支持MS Access。因为我正在获取html文件中的数据,我已将该html文件附加到MS Aacess数据库
答案 0 :(得分:0)
很抱歉,但MS Access不提供以递归模式运行查询的功能CTE。可以使用VBA宏继续学生收集,将逗号分隔值拆分为一组记录;)
比方说,你有表学生的字段:
示例数据:
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) );
要添加宏,请执行以下步骤:
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