想象一下,像下面的示例一样,您有成千上万的记录,并且您有一列中的每一行都有数百个“收藏的食物”,需要对其各自的表和行进行规范化。手动执行此操作将花费很多时间,而“;”符号,如牛排所示;葡萄;鸡蛋,妨碍了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      ║
                      ╚══════╧═══════════════════╝

最佳答案

将用户的IDName加载到新表中。

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/

10-12 01:06