将一个表中一列的字段连接到另一个表中的单个逗号分隔值

时间:2011-09-29 16:48:05

标签: ms-access ms-access-2007 access-vba

非常感谢可以提供给Access和VB菜鸟的任何帮助。我要做的是连接一个表中的值,并将其作为逗号分隔值插入另一个表中的字段。我正在尝试将所有服务器名称称为Linux框,并将它们连接到不同的字段中。

表A看起来像这样

Machine Name | Zone   | Operating System
----------------------------------------
Server01      Zone A    Linux
Server02      Zone B    Linux
Server03      Zone A    Windows
Server04      Zone C    Windows
Server05      Zone B    Solaris

表B包含我要插入的字段:Affected_Machine_Names。

现在,我已经尝试查看Concatenate / Coalesce帖子,但Access中的SQL视图不喜欢Declare语句。我的VB技能很糟糕,我似乎无法让代码在VB for Applications中运行。不幸的是,我无法将此数据库转换为我们的SQL场,因为我目前没有可用的服务器来托管它。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:4)

您可以使用Allen Browne的Concatenate values from related records。从该网页复制功能代码并将其粘贴到新的标准模块中。保存模块并为模块提供与函数名称不同的名称; modConcatRelated可以工作。

然后我认为你应该能够在查询中使用该功能,即使你不熟练使用VBA。

首先注意我更改了TableA中的字段名称以替换带下划线的空格。有了这个改变,这个查询...

SELECT
    sub.Operating_System, 
    ConcatRelated("Machine_Name", "TableA", 
        "Operating_System = '" & sub.Operating_System & "'") AS Machines
FROM [SELECT DISTINCT Operating_System FROM TableA]. AS sub;

...生成此结果集:

Operating_System Machines
Linux            Server01, Server02
Solaris          Server05
Windows          Server03, Server04

如果您不能像我一样重命名字段,请使用单独的查询来选择不同的操作系统。

SELECT DISTINCT TableA.[Operating System]
FROM TableA;

将其保存为qryDistinctOperatingSystems,然后在此版本的主查询中使用它:

SELECT
    sub.[Operating System], 
    ConcatRelated("[Machine Name]", "TableA", 
        "[Operating System] = '" & sub.[Operating System] & "'") AS Machines
FROM qryDistinctOperatingSystems AS sub;

答案 1 :(得分:1)

这是一个相当基本的VBA函数,它将循环遍历列中的每一行,并将其连接到逗号分隔的结果字符串。例如,对于您的示例,它将返回“Server01,Server02,Server03,Server04,Server05”。 (不要忘记替换列名和表名)

Function ConcatColumn(OS As String) As String
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Select * from TableA")

    Dim result As String

    'For every row after the first, add a comma and the field value:
    While rst.EOF = False
        If rst.Fields("Operating System") = OS Then _
            result = result & ", " & rst.Fields("MyValue")
        rst.MoveNext
    Wend

    'Clean it up a little and put out the result
    If Left(result, 2) = ", " Then result = Right(result, Len(result) - 2)
    Debug.Print result
    ConcatColumn = result
End Function

要使用它,
1. ConcatColumn("Windows")将返回“Server04,Server03”
2. ConcatColumn("Linux")将返回“Server01,Server02”
3. ConcatColumn("Solaris")将返回“Server05”
4. ConcatColumn("")将返回“”。