我在MS Access中有下表:
- app_id=PK,自动递增
- app=数字,显示为值列表(否,是(
我的表格样本数据:
tblapp
app_id app
1 NO
2 No
3 YES
我想将列app
转换为显示编号
CCD_ 2和CCD_ 3
使用vba
转换愿望表:
tblapp
app_id app
1 1
2 1
3 2
一种解决方案是创建一个新列,复制数据。然后删除旧列,并将新名称重命名为旧名称。
还有其他解决方案吗?
基于Gustav
注释,我提出了以下解决方案。
VBA代码:
Private Sub btn_Click()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim sql As String
Set dbs = CurrentDb
' Add temp column.
dbs.Execute "ALTER TABLE tblapp ADD COLUMN temp_app NUMBER;"
' Add-update data to temp column.
Set rst = dbs.OpenRecordset("SELECT app_id, IIF(app="NO", 1, 2) AS temp_app FROM tblapp;", dbOpenDynaset)
With rst
Do Until .EOF
sql = "UPDATE [tblapp] SET [temp_app] = '" & rst!temp_app & "' WHERE [app_id] = " & rst!app_id & " ;"
dbs.Execute (sql)
.MoveNext
Loop
End With
' Delete app column(old).
dbs.Execute "ALTER TABLE tblapp DROP app;"
' Add new app column.
dbs.Execute "ALTER TABLE tblapp ADD COLUMN app NUMBER;"
' Copy data from temp to app column.
dbs.Execute "UPDATE tblapp Set app = temp_app;"
' Delete temp column.
dbs.Execute "ALTER TABLE tblapp DROP temp_app;"
rst.Close
dbs.Close
End Sub
如果表非常大,您可能会发现根据所需的新列创建一个全新的表更快速高效,只需通过适当的转换即可跨表传输数据。您可以通过保存的查询(从而避免对VBA的需要(来完成这一切,或者,从VBA为查询运行SQL。
它可能更高效的原因是,表数据可能是连续存储在磁盘上的,因此添加新列并不是简单地将新数据添加到连续区域的末尾,而是为新列的每行值每n个字节添加一个新空间。这可能会导致对磁盘空间进行大量的重新组织工作。如果您采用上述替代方法,它可能会暂时占用更多空间(因为您必须创建第二个表(,但总体而言可能会快得多。