2013-01-31 58 views
1

在Microsoft Access中,我想將具有相同鍵(=正在重複)的表中的特定列合併到新表中。Microsoft Access - 將具有相同鍵的內容合併到一個新表中

源表是這樣的

Key Content 
Apple X 
Banana B 
Banana D 
Banana E 
Banana G 
Lemon A 
Lemon X 
Orange A 

我想創建一個新的表,其中有每個鍵只有一個入口,每個按鍵具有由累計到所有相應的「內容」字段的字段一個領域。每個「內容」值應該這樣,例如定界:

Apple X 
Banana B<x>D<x>E<x>G 
Lemon A<x>X 
Orange A 

我寧願把它像上面,但它也可以工作,如果他們在不同的領域,如低於/列:

Apple X 
Banana B D E G 
Lemon A X 
Orange A 

我真的很感謝幫助。當谷歌搜索這個我已經找到了退出一些第三方加載項(像這個http://www.tucows.com/preview/1586663/MS-Access-Join-Two-Tables-Software),似乎是解決這個問題,但肯定這可以用MS Access本身...。或...?

回答

1

一個版本將使用UDF和這個查詢:

SELECT Distinct Fruit.Key, 
    ConcatADO("SELECT Content FROM Fruit WHERE Key='" & [Key] & "'","<x>","<x>") 
     AS AllRows 
INTO NewFruit 
FROM Fruit 

用戶定義函數(UDF)

Function ConcatADO(strSQL As String, strColDelim, strRowDelim) 
    Dim rs As New ADODB.Recordset 
    Dim strList As String 

    On Error GoTo Proc_Err 

     If strSQL <> "" Then 
      rs.Open strSQL, CurrentProject.Connection 
      strList = rs.GetString(, , strColDelim, strRowDelim) 
      strList = Mid(strList, 1, Len(strList) - Len(strRowDelim)) 
     End If 

     ConcatADO = strList 

    Exit Function 

Proc_Err: 
     ConcatADO = "***" & UCase(Err.Description) 
End Function 

查詢設計窗口中操作,您可以創建一個交叉

TRANSFORM Min(Fruit.Content) AS MinOfContent 
SELECT Fruit.Key 
FROM Fruit 
GROUP BY Fruit.Key 
PIVOT Fruit.Content; 

哪會退回

Key  A B D E G X 
Apple      X 
Banana  B D E G 
Lemon A     X 
Orange A 

然後,您可以保存交叉表並根據交叉表創建新的查詢。這個查詢可能是一個Make Table查詢來獲取新表,但正如你所看到的,你有幾列。

如果您爲每個鍵有可能的預定數量的行,還有其他方法。

最後,你一定要問問自己,是否真的要走de-normalizing

1

另一種方法是創建帶有兩列(Key,Content)的表,然後運行下面的函數將數據複製到新表中。你必須用你的表名替換「ExistingTableName」和「NewTableName」。

Sub CreateNewTable() 
    Dim rs As Recordset 
    Dim rsContent As Recordset 
    Dim strContent As String 
    'Select and loop through all keys 
    Set rs = CurrentDb.OpenRecordset("SELECT DISTINCT Key FROM [ExistingTableName]") 
    Do Until rs.EOF 
     'Select all content records for this key and combine into a string 
     Set rsContent = CurrentDb.OpenRecordset("SELECT Content FROM [ExistingTableName] WHERE Key = " & Chr(34) & Nz(rs!Key) & Chr(34)) 
     strContent = "" 
     Do Until rsContent.EOF 
     strContent = strContent & rsContent!Content & "," 
     rsContent.MoveNext 
     Loop 
     If Len(strContent) > 0 Then 
     strContent = Mid(strContent, 1, Len(strContent) - 1) 
     End If 
     CurrentDb.Execute "INSERT INTO [NewTableName] (Key, Content) VALUES (" & Chr(34) & Nz(rs!Key) & Chr(34) & ", " & Chr(34) & Nz(strContent) & Chr(34) & ")" 
     rs.MoveNext 
    Loop 

    Set rs = Nothing 
    Set rsContent = Nothing 
End Sub 

我不認爲有沒有辦法做到這一點,沒有VBA。

鑑於您在使用關係數據庫,您應該考慮使用一個表來存儲鍵和另一個表來存儲內容(每行/記錄一個內容),然後使用第三個表或通過添加'key'作爲內容表中的外鍵。我也總是使用自動編號作爲所有MS Access表中的主鍵,如果不是所有其他原因,這是一個好主意,只是爲了避免損壞,並且使您能夠將「aple」這樣的拼寫錯誤更改爲「apple」而無需打破你們的關係。

+0

'aple'改爲'apple'而不損壞餅圖? :) – Fionnuala

+0

當然,讓我知道你是否想了解更多關於這方面的信息。 – Dan

相關問題