使用MS Access和SQL将数据组合到一个字段中

时间:2018-07-11 19:04:54

标签: sql vba ms-access

我有这两个表:

组:

+----+-------+------+
| ID | Title | Info |
+----+-------+------+
|  1 | Red   |      |
|  2 | Blue  |      |
|  3 | Green |      |
+----+-------+------+

联系人:

+----+-------+----------------+
| ID | Name  |    Contact     |
+----+-------+----------------+
|  1 | Joe   | joe@test.com   |
|  3 | Billy | billy@test.com |
|  3 | Sally | sally@test.com |
+----+-------+----------------+

我正在尝试根据ID进行匹配,并将所有数据从“联系人”移至“组”中的“信息”字段,这样只有一个表,而每个联系人都没有重复的记录。

+----+-------+----------------------------------------------+
| ID | Title |                     Info                     |
+----+-------+----------------------------------------------+
|  1 | Red   | Joe: joe@test.com                            |
|  2 | Blue  |                                              |
|  3 | Green | Billy: billy@test.com, Sally: sally@test.com |
+----+-------+----------------------------------------------+

我是否试图通过使用SQL来超越界限?我不知道如何使用SQL将多个字段聚合到一个字段中。我正在使用MS Access,所以也许我应该在导出数据之前考虑使用VBA执行此操作。

编辑:不是Microsoft Access condense multiple lines in a table的重复项 我将多个字段压缩为一个字段,而不仅仅是将一个字段压缩为一个字段。

1 个答案:

答案 0 :(得分:2)

您不能仅凭SQL做到这一点。您需要一个VBA功能。我下面显示的功能使用DAO库。确保具有对相应DLL(Microsoft DAO 3.6对象库)的引用。

将此代码添加到模块中:

Public Function JoinRecords(dataSource As String, Optional delimiter As String = ";", _
                                  Optional columns As Long = 1) As String
    Dim db As DAO.Database, rs As DAO.Recordset, s As String, col As Long

    Set db = CurrentDb
    Set rs = db.OpenRecordset(dataSource, dbOpenForwardOnly)
    Do Until rs.EOF
        For col = 0 To columns - 1
            If s = "" Then
                s = Nz(rs(col))
            Else
                s = s & delimiter & Nz(rs(col))
            End If
        Next col
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing
    db.Close: Set db = Nothing
    JoinRecords = s
End Function

然后您可以运行此查询

UPDATE Groups
SET Info = JoinRecords("SELECT Name & ': ' & Contact FROM Contacts WHERE ID=" & ID, ", ")