想象一下,像下面的示例一样,您有成千上万的记录,并且您有一列中的每一行都有数百个“收藏的食物”,需要对其各自的表和行进行规范化。手动执行此操作将花费很多时间,而“;”符号,如牛排所示;葡萄;鸡蛋,妨碍了Microsoft Access的表格向导,它似乎不起作用。
我如何半自动地将这些讨厌的行包含多个除以;的行,以在自己的表中进行标准化?
Incorrect
╔══════╤═══════════╤═══════════════════╗
║ ID │ Name │ Favorite Foods ║
╠══════╪═══════════╪═══════════════════╣
║ 1 │ John │Steak; Grapes; Eggs║
╟──────┼───────────┼───────────────────╢
║ 2 │ Jeff │ Eggs; Toast ║
╟──────┼───────────┼───────────────────╢
║ 3 │ Joel │Pear; Onion; Apples║
╚══════╧═══════════╧═══════════════════╝
Normalized
╔══════╤═══════════╗ ╔══════╤═══════════════════╗
║ ID │ Name ║ ║ ID │ Favorite Foods ║
╠══════╪═══════════╣ ╠══════╪═══════════════════╣
║ 1 │ John ║ ║ 1 │ Steak ║
╟──────┼───────────╢ ╟──────┼───────────────────╢
║ 2 │ Jeff ║ ║ 1 │ Grapes ║
╟──────┼───────────╢ ╟──────┼───────────────────╢
║ 3 │ Joel ║ ║ 1 │ Eggs ║
╚══════╧═══════════╝ ╟──────┼───────────────────╢
║ 2 │ Eggs ║
╟──────┼───────────────────╢
║ 2 │ Toast ║
╟──────┼───────────────────╢
║ 3 │ Pear ║
╟──────┼───────────────────╢
║ 3 │ Onion ║
╟──────┼───────────────────╢
║ 3 │ Apples ║
╚══════╧═══════════════════╝
最佳答案
将用户的ID
和Name
加载到新表中。
SELECT DISTINCT o.ID, o.Name
INTO tblUsers
FROM OldTable AS o;
创建一个新的空表
tblFavorites
,以保存用户的[Favorite Foods]
。然后创建并运行一个VBA过程,该过程使用DAO记录集从OldTable
中提取信息并将其添加到tblFavorites
中。Dim db As DAO.Database
Dim rsSrc As DAO.Recordset
Dim rsDest As DAO.Recordset
Dim varFoods As Variant
Dim varItem As Variant
Set db = CurrentDb
Set rsSrc = db.OpenRecordset("OldTable", dbOpenTable)
Set rsDest = db.OpenRecordset("tblFavorites", dbOpenTable, dbAppendOnly)
Do While Not rsSrc.EOF
varFoods = Split(rsSrc![Favorite Foods], ";")
For Each varItem In varFoods
rsDest.AddNew
rsDest!ID = rsSrc!ID
rsDest![Favorite Foods] = Trim(varItem)
rsDest.Update
Next
rsSrc.MoveNext
Loop
关于sql - 规范化为Microsoft Access中的第一种形式-是否有半自动方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20637424/