Sql 规范化为Microsoft Access内部的第一个表单-是否有半自动方法?
假设您有成千上万条记录,如下面的示例,并且您有一个列,其中每行有数百条“最喜欢的食物”,需要标准化为它们自己的表和行。手动执行此操作将花费很长时间,而“;”符号如图所示;葡萄;鸡蛋,妨碍了Microsoft Access的表格向导,它似乎不起作用 我如何半自动地将这些讨厌的行中的多个项目除以;'在他们自己的表中要标准化的Sql 规范化为Microsoft Access内部的第一个表单-是否有半自动方法?,sql,ms-access,normalization,Sql,Ms Access,Normalization,假设您有成千上万条记录,如下面的示例,并且您有一个列,其中每行有数百条“最喜欢的食物”,需要标准化为它们自己的表和行。手动执行此操作将花费很长时间,而“;”符号如图所示;葡萄;鸡蛋,妨碍了Microsoft Access的表格向导,它似乎不起作用 我如何半自动地将这些讨厌的行中的多个项目除以;'在他们自己的表中要标准化的 Incorrect ╔══════╤═══════════╤═══════════════════╗ ║ ID │ Name │ Favorite Foo
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
加载到新表中
选择不同的o.ID、o.Name
陷入困境
从旧表中选择o;
创建一个新的空表,tblFavorites
,以容纳用户的[喜爱的食物]
。然后创建并运行一个VBA过程,该过程使用DAO记录集从OldTable
中提取信息,并将其添加到tblFavorites
Dim db作为DAO.Database
Dim rsSrc作为DAO.Recordset
将rsDest设置为DAO.Recordset
作为变体的食品
作为变体的Dim varItem
Set db=CurrentDb
Set rsSrc=db.OpenRecordset(“OldTable”,dbOpenTable)
Set rsDest=db.OpenRecordset(“tblFavorites”,dbOpenTable,dbAppendOnly)
而不是rsSrc.EOF
varFoods=Split(rsSrc![喜爱的食物],“;”)
对于varFoods中的每个变量
rsDest.AddNew
快!ID=rsSrc!身份证件
快![喜爱的食物]=修剪(varItem)
rsDest.Update
下一个
rsSrc.MoveNext
环
请注意,您的标准化解决方案并没有真正标准化。一个食物项目可能会被0、1或更多的客户请求,因此,您有一个M-M关系。除此之外,同一客户可能会访问并发出不同的订单。比如说,Jeff有一天可以来索要牛排和梨。如果表中包含的行数在百万范围内,您可以使用Excel文本对列进行编辑,以创建一个更宽的表,并将其机械地折叠回原始数据,删除重复项。取消数据透视是一个典型的难题,并且没有很好的通用解决方案。可读ASCII图形+1