Microsoft Access并在一个字段中存储多个值 - 最好从Excel导入?

时间:2015-03-27 14:24:51

标签: excel ms-access

这与早期的stackoverflow问题一致:Store multiple values in one database field in Access (hear me out)

我有一个联系人数据库,其联结表ContactType具有ContactTypeID(PK),ContactID(FK)和TypeID(FK)。

问题是,我从Excel导入数据。以下是为此设置Excel的最佳方法吗?

在Excel中,每个联系人都有一行,不同类型代码有几列(即每行有10列可用于类型代码)。 在Access中创建一个Union Query,它将获取每一行中的所有类型代码,并为每个联系人创建一个包含一个或多个记录的Junction表,每个记录由联系人和类型组成。

有没有更好的方法为此数据输入设置Excel?看起来很尴尬,虽然我之前已经做过它并且有效。

1 个答案:

答案 0 :(得分:0)

Access Union查询以及SQL的文本都有限制。因此,如果您的数据很大,这种方法可能无法很好地扩展。

您可以执行的一种策略是运行Excel宏来遍历每一行,并将每一行转置到同一列中,以创建多对多Junction表导入。

Sub NormalizeData()
    currlastrow = Sheets(1).UsedRange.Rows.Count

    For i = 1 To currlastrow
        newlastrow = Sheets(2).Range("A1").CurrentRegion.Rows.Count

        'COPY/PASTE REPEATING CONTACT NAME
        Sheets(2).Range("A" & newlastrow + 1 & ":A" & newlastrow + 10) = Sheets(1).Range("A" & i)

        'COPYING DISTINCT TYPE CODES
        Sheets(1).Range("B" & i & ":K" & i).Copy

        'TRANSPOSING DISTINCT TYPE CODE
        Sheets(2).Range("B" & newlastrow + 1).PasteSpecial Transpose:=True

        MsgBox newlastrow
    Next i
End Sub

可能涉及一些空行清理。但实质上,这是将数据从宽格式转换为长格式,最终结果为标准化的m:m表格。

广泛的格式:

CONTACT   |  TYPE1 |  TYPE 2  |  TYPE 3 |  TYPE 4 |  TYPE 5 ...
Anna          Java     C++        SQL       PHP       Python    
Bob           VB       Java       C#        C++       R     
Charlie       PHP      Ruby       Perl      CSS       VB

LONG FORMAT:

Contact |  TYPE
Anna       Java
Anna       C++
Anna       SQL
Anna       PHP
Anna       Python
Bob        VB
Bob        Java
Bob        C#
Bob        C++
Bob        R
Charlie    PHP
Charlie    Ruby
Charlie    Perl
Charlie    CSS
Charlie    VB