【问题标题】:Access convert multi-valued field table访问转换多值字段表
【发布时间】:2018-11-27 12:24:09
【问题描述】:

我已经接管了一个数据库,该数据库具有一个包含多值字段的表,例如

我正在尝试将其转换为单值字段表,例如

两个表中的数字只是一个ID,它指的是一个名为Contact_ID 的人。

我已经尝试在使用交叉表查询的 Access 和使用转置的 Excel 中执行此操作,但是我无法生成一个新表,其中一列中包含相同 Contact_ID 的多个示例,第二列中包含唯一关键字。

感谢任何关于最佳方式的建议。

【问题讨论】:

  • 所以您希望每个逗号分隔的条目在其自己的行中具有与原始行相同的 ID 号,对吧?
  • 是的。我正在研究的一个选项涉及一个新表,其中每个关键字都有一个单独的 FieldName(字段 1、字段 2 等),然后从中创建一个查询以显示每个 ID 的所有关键字并将其复制到一个新表中。它不是特别优雅,我仍在坚持寻求更简单的解决方案。

标签: sql excel ms-access-2016


【解决方案1】:

多值字段中的值将来自数据库中的表。

要返回单个项目,您需要将.Value 添加到您的查询字段。

例如,

如果 Table1 包含 ID 作为自动编号和 MyLookUpItems 作为单个项目。

| MyLookUpID | MyLookUpField |
|------------|---------------|
| 1          | Alcohol       |
| 2          | Smoking       |
| 3          | diet          |
| 4          | Nutrition     |

Table2 包含 MyMultiValueField 显示多个值。

| MyMultiValueField |
|-------------------|
| Smoking, diet     |
| Alcohol, diet     |

要退回您将使用的单个项目:

SELECT MyMultiValueField.Value
FROM   Table2  

这将返回:

| MyMultiValueField.Value |
|-------------------------|
| diet                    |
| Smoking                 |
| Alcohol                 |
| diet                    |

然后您可以链接回原始 ID:

SELECT MyLookUpID, MyLookUpField
FROM Table2 INNER JOIN Table1 ON Table2.MyMultiValueField.Value = Table1.MyLookUpID  

将返回:

| MyLookUpID | MyLookUpField |
|------------|---------------|
| 1          | Alcohol       |
| 2          | Smoking       |
| 3          | diet          |  

如果您不确定多值字段的来源,请在设计视图中打开表格并查看该字段的 Lookup 选项卡。
Row Source 看起来像:

SELECT [Table1].[MyLookUpID], [Table1].[MyLookUpField] FROM Table1 ORDER BY [MyLookUpField]; 

显示Table1 是源。

编辑:
现在,写完所有这些......只需看看表格的设计和行源中的表格 您在问题中查找的单值字段表。

【讨论】:

    【解决方案2】:

    对于未知数量的逗号分隔字符串,最简单的方法可能是使用记录集遍历表,使用Split 函数分隔项目,然后填充另一个记录集,例如:

    Function ConvertTable()
        Dim strOldTable As String: strOldTable = "Table1"
        Dim strNewTable As String: strNewTable = strOldTable & "_new"
    
        Dim dbs As DAO.Database
        Dim rst1 As DAO.Recordset
        Dim rst2 As DAO.Recordset
        Dim lngCID As Long
        Dim itm
    
        Set dbs = CurrentDb
    
        DoCmd.CopyObject , strNewTable, acTablem, strOldTable
        dbs.Execute "delete from [" & strNewTable & "]"
    
        Set rst1 = dbs.OpenRecordset(strOldTable)
        Set rst2 = dbs.OpenRecordset(strNewTable)
        If Not rst1.EOF Then
            rst1.MoveFirst
            Do Until rst1.EOF
                lngCID = rst1!Contact_ID
                For Each itm In Split(rst1!Field1, ",")
                    If Trim(itm) <> "*" Then
                        rst2.AddNew
                        rst2!Contact_ID = lngCID
                        rst2!Field1 = Trim(itm)
                        rst2.Update
                    End If
                Next itm
                rst1.MoveNext
            Loop
        End If
        rst1.Close
        rst2.Close
        Set rst1 = Nothing
        Set rst2 = Nothing
        Set dbs = Nothing
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多