2011-09-29 45 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

相關問題