2011-09-29 39 views
4

任何可以提供给Access和VB noob的帮助都将不胜感激。我想要做的是连接一个表中的值,并将其作为逗号分隔值插入到另一个表中的字段中。我试图把所有名为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农场,因为我目前没有可用的服务器来托管它。

任何人都可以指向正确的方向吗?

+1

这可以用一个用户定义函数来完成,但你确定要这么做吗?现实世界的问题是什么?有人可能会提出一个侧面的方法更符合关系数据库。 – Fionnuala

+0

奇怪的是,ADO更容易,例如http:// stackoverflow。com/questions/92698/combine-rows-concatenate-rows/93863#93863 – Fionnuala

回答

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; 
+0

我得到它与这工作!实际上我的字段名有下划线,但是当我复制表格时,我复制了我放入的没有下划线的标签ID,因此您的第一个代码段工作。我感谢帮助! – user971584

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 

要使用此,
将返回 “SERVER04,Server03”
2. ConcatColumn("Linux")将返回 “Server01上,Server02上”
3. ConcatColumn("Solaris")将返回“Server05”
4. ConcatColumn("")将返回“”。

+0

对,但是如果我在另一个查询中将所有操作系统从主表中分离出3个独立的表,该怎么办?这很丑陋,但它可能工作。我会尝试并报告。谢谢! – user971584

+0

在@PowerUser的辩护中,OP的要求并没有被非常清楚地描述! –

+0

感谢提醒,HansUp。这很容易修复。我添加了一些IF语句并放入OS参数。更好? – PowerUser

相关问题