Sql 如何规范Access中具有逗号分隔值的数据字段
这似乎是一个常见的问题,但我似乎无法得到答案 我使用VBA从excel文件中读取的表包含一个字段,该字段有多个值,用逗号分隔符分隔。我知道正确的方法是规范化这个字段。不过,我似乎无法让我的解决方案发挥作用 我的桌子看起来像这样:Sql 如何规范Access中具有逗号分隔值的数据字段,sql,excel,ms-access,vba,Sql,Excel,Ms Access,Vba,这似乎是一个常见的问题,但我似乎无法得到答案 我使用VBA从excel文件中读取的表包含一个字段,该字段有多个值,用逗号分隔符分隔。我知道正确的方法是规范化这个字段。不过,我似乎无法让我的解决方案发挥作用 我的桌子看起来像这样: ProdID | Color | Value 1 | Blue, Green | 30 2 | White, Blue, Red | 50 3 etc. 我试图通过先将值放入临时表,然后更新主表来拆分这些值,但这似乎很麻烦,我怀疑一定有更智能的解决
ProdID | Color | Value
1 | Blue, Green | 30
2 | White, Blue, Red | 50
3 etc.
我试图通过先将值放入临时表,然后更新主表来拆分这些值,但这似乎很麻烦,我怀疑一定有更智能的解决方案
'check that data is available and copy data to new temporary sheet
rowCount = wks.UsedRange.Rows.count
If rowCount < 2 Then
MsgBox ("The Workbook " & wkb & " contains no Data. The Process will not continue to execute!")
GoTo EndCleanUp
Else
'delete old data in DB table
With tblMorningstarFS
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM " & .Name
DoCmd.SetWarnings True
End With
'create array with prod color id set
Dim tempArray()
ReDim tempArray(rowCount, 1)
With wks
For i = 0 To rowCount
tempArray(i, 0) = .Cells(i + 1, 1) ' prodID
tempArray(i, 1) = .Cells(i + 1, 2) ' colorID
Next i
End With
'create temporary table
curDatabase.Execute "CREATE TABLE tempColorTable " _
& "(ProdID CHAR, ColorID CHAR);"
'fill prodID/colorID table with array info
With curDatabase.OpenRecordset("tempColorTable", dbOpenTable)
For i = 1 To UBound(tempArray, 1) + 1
.AddNew
rs.Fields("ProdID") = wks.Range("A" & i + 1).Value
rs.Fields("ColorID") = wks.Range("C" & i + 1).Value
rs.Update
Next i
End With
'update the exisiting table with information
Dim SQL As String
SQL = "INSERT INTO tblProd_Color ( ProdID, ColorID ) " & _
"SELECT tempColorTable.ProdID, tempColorTable.ColorID " & _
"FROM tempColorTable"
DoCmd.RunSQL SQL
'fill prod table with value information
With wks
For i = 1 To rowCount
rs.AddNew
rs.Fields("PRODUCT") = .Range("A" & i + 1).Value
rs.Fields("VALUE") = .Range("C" & i + 1).Value
rs.Update
Next i
End With
With wks
For i = 1 To rowCount
rs.AddNew
rs.Fields("PRODUCT") = .Range("A" & i + 1).Value
rs.Fields("VALUE") = .Range("C" & i + 1).Value
rs.Update
Next i
End With
End If
”检查数据是否可用,并将数据复制到新的临时工作表中
rowCount=wks.UsedRange.Rows.count
如果行计数小于2,则
MsgBox(“工作簿”&wkb&“不包含任何数据。进程将不会继续执行!”)
GoTo EndCleanUp
其他的
'删除数据库表中的旧数据
用tblMorningstarFS
DoCmd.SetWarnings错误
DoCmd.RunSQL“DELETE*FROM”&.Name
DoCmd.SetWarnings True
以
'使用产品颜色id集创建阵列
Dim tempArray()
ReDim临时阵列(行数,1)
有工作
对于i=0的行计数
tempArray(i,0)=.Cells(i+1,1)'prodID
tempArray(i,1)=.Cells(i+1,2)'colorID
接下来我
以
'创建临时表
curDatabase.Execute“CREATE TABLE tempColorTable”_
&(ProdID CHAR、ColorID CHAR)
'用数组信息填充prodID/colorID表
使用curDatabase.OpenRecordset(“tempColorTable”,dbOpenTable)
对于i=1到UBound(tempArray,1)+1
.AddNew
rs.Fields(“ProdID”)=wks.Range(“A”&i+1).值
rs.Fields(“ColorID”)=wks.Range(“C”&i+1).值
rs.更新
接下来我
以
'使用信息更新现有表
将SQL设置为字符串
SQL=“插入tblProd_颜色(ProdID,ColorID)”&_
“选择tempColorTable.ProdID、tempColorTable.ColorID”&_
“来自tempColorTable”
DoCmd.RunSQL
'用值信息填充产品表
有工作
对于i=1的行计数
艾德纽卢比
rs.字段(“产品”)=范围(“A”&i+1).值
rs.字段(“值”)=范围(“C”&i+1).值
rs.更新
接下来我
以
有工作
对于i=1的行计数
艾德纽卢比
rs.字段(“产品”)=范围(“A”&i+1).值
rs.字段(“值”)=范围(“C”&i+1).值
rs.更新
接下来我
以
如果结束
这段代码还不能完全工作,但在我投入时间使其工作之前,我想知道我是否至少在正确的轨道上
谢谢你的意见 我也有同样的情况。
我使用了[HeaderTable]我最终做了一些与你的答案非常相似的事情。谢谢你的输入!
1. Created a Header table that stores all the "Header Data", in your case ProdID,Value
2. Created a table containing "Detail Data" in your case ProdID,RowNo,Color
3. Insert all Row's ProdID into Header Table
4. Split the values in the field Color based on index of (,)Comma. For each Substring insert a row into Detail table with ProdID,RowNo,Substring as color.