Sql 规范化为Microsoft Access内部的第一个表单-是否有半自动方法?

Sql 规范化为Microsoft Access内部的第一个表单-是否有半自动方法?,sql,ms-access,normalization,Sql,Ms Access,Normalization,假设您有成千上万条记录,如下面的示例,并且您有一个列,其中每行有数百条“最喜欢的食物”,需要标准化为它们自己的表和行。手动执行此操作将花费很长时间,而“;”符号如图所示;葡萄;鸡蛋,妨碍了Microsoft Access的表格向导,它似乎不起作用 我如何半自动地将这些讨厌的行中的多个项目除以;'在他们自己的表中要标准化的 Incorrect ╔══════╤═══════════╤═══════════════════╗ ║ ID │ Name │ Favorite Foo

假设您有成千上万条记录,如下面的示例,并且您有一个列,其中每行有数百条“最喜欢的食物”,需要标准化为它们自己的表和行。手动执行此操作将花费很长时间,而“;”符号如图所示;葡萄;鸡蛋,妨碍了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
加载到新表中

选择不同的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