- 掌握 INNER/LEFT/RIGHT JOIN、不等連接以及如何避免意外的交叉連接。
- 使用 UNION 模擬 FULL OUTER JOIN 並使用下列方式控制資料類型 技巧 作為 IIf(False,0,Null)。
- 解決自動編號衝突,觸發級聯更新,定義明確的衝突規則。

當你與幾個人一起工作時 數據庫 de Microsoft Access遲早都需要將它們統一起來,同時又不遺失資訊或斷開連結。在現實世界中, 同一資料庫的不同副本、每個項目單獨的表,或定期從外部系統匯入。知道如何很好地合併它們,是系統穩定運作的關鍵,而不是一堆重複資料。
在本實用指南中,我們將逐步分解您所需的一切: 連接 本書涵蓋了 Access 及其類型的知識,涵蓋了 UNION 查詢技巧、自動編號衝突解決、衝突偵測以及兩個 .accdb 檔案單獨產生時的建議。此外,我們還提供了關於 結合 PDF 來自 VBA 罪 使用Adobe Acrobat,以防您的工作流程需要它。
合併多個 Access 檔案到底是什麼意思?
合併不僅僅是複製貼上。實際上,它意味著合併同源表、維護引用完整性以及確定解決衝突的標準。 重複或衝突的記錄。它還涉及了解 Access 如何關聯表以及如何組合來自不同來源的數據,這是透過查詢中的 JOIN 完成的,或者當您想要堆疊相容的結果集時透過 UNION 查詢完成的。
在開始之前,最好先檢查每個檔案的結構、鍵和關係。了解哪些表是主表、哪些是從屬表,以及哪些欄位充當鍵(主鍵和外鍵),可以省去很多麻煩。一些準備工作,例如激活 級聯更新 在明確定義的關係中,它可以防止標識符發生變化時子記錄被遺棄。
Access 中的關係與連結:一切的基礎
資料庫由透過公共欄位相互關聯的表構成。在 Access 中,這些關係在查詢設計檢視中轉換為連接線:一條連接線連接充當連結的字段,並定義資料的連接方式。在一對多關係中,Access 甚至會顯示 1 和符號 ∞ 如果您已經套用了參照完整性,那就行了。
連接就像一個智慧過濾器:它們定義了兩側哪些行需要匹配以及如何匹配。除了過濾之外,連接還會將滿足條件的每對資料合併到結果集中。因此,了解所使用的連接類型至關重要,並且,如有必要, 打開組合的屬性 (雙擊該行)來調整行為。
Access 中的聯接類型
內連接
內連接僅傳回兩個表中在連接欄位中具有匹配值的行。這是最常見的類型,Access 在偵測到相容的關係或欄位時會自動建立它。如果您未指定類型,Access 會假設 預設為 INNER JOIN.
將兩個資料表新增至查詢時,如果它們共用一個類型相容的欄位(其中一個是主鍵),Access 通常會為您建立聯結。如果將查詢用作來源,則通常需要手動建立鏈接,方法是在設計網格中將一個欄位拖到另一個欄位上,這會繪製 連接線.
SQL INNER JOIN 語法 在 FROM 子句中,使用任何有效的關係運算子(等於、不等於、大於/小於等):
FROM tabla1 INNER JOIN tabla2
ON tabla1.campo1 = tabla2.campo2
請注意,除了非常特殊的情況外,最常見的運算子是相等;使用其他運算子會產生所謂的 不平等組合 (我們將在下面看到這一點)。
左外連接與右外連接(LEFT JOIN/RIGHT JOIN)
外連接包含一側的所有行,即使它們在另一側不匹配。在左連接中,左表的所有行都會列出,而右表只包含匹配的行;在右連接中,情況正好相反。這對於保留 「孤兒」記錄 一方面,當您審核覆蓋範圍或完整性時。
若要將內連接轉換為外連接,請在設計檢視中雙擊連接線,選擇在一側包含所有記錄的選項,按“確定”,您將看到該線顯示 方向箭頭 指示所有行均來自哪個表。
您可能在同一個查詢中混合使用了 LEFT JOIN 和 INNER JOIN,而 Access 不知道先執行哪一個。在這種情況下,會出現歧義錯誤。解決方案是 重新排序查詢,將其拆分為子查詢,或透過重新排列連接來明確評估順序,以免產生歧義。
LEFT/RIGHT JOIN SQL 語法 在 FROM 子句中:
FROM tabla1 LEFT JOIN tabla2
ON tabla1.campo1 = tabla2.campo2
FROM tabla1 RIGHT JOIN tabla2
ON tabla1.campo1 = tabla2.campo2
使用 UNION 的完全外連線(FULL OUTER)
Access 本身不包含完整的外部連接 (FULL OUTER JOIN),但你可以使用 UNION 將 LEFT JOIN 的結果與 RIGHT JOIN 的結果連接起來,並進行篩選以避免重複匹配行,從而模擬完整的外部連接。思路很簡單:合併 兩側所有行 並在有匹配的地方進行匹配,在沒有匹配的地方保留空值。
典型工作方案:
- 在連接欄位上使用 LEFT JOIN 建立查詢。
- 複製您的 SQL,將 LEFT 更改為 RIGHT 並貼上到 UNION 下。
- 在右側部分,新增一個 WHERE 子句,檢查左表的關鍵欄位是 一片空白 以免重複配對。
這樣,即使沒有本機支持,您也可以在 Access 中複製 FULL OUTER 的效果,保持 連貫完整的結果 en ambos Sentidos。
交叉連接
交叉連接將一個表中的每一行與另一個表中的每一行配對(笛卡爾積)。這種情況通常發生在你向查詢中添加表格時,卻忘記定義它們的關聯,從而導致成千上萬個毫無意義的連接,並且 執行時間長。不過,還是有一些有用的場景:例如,研究具有不同理論回報率的客戶的所有可能組合(91 個客戶乘以 5 個百分比 = 455 個假設行)。
如果您發現查詢中的記錄數量不合理,請檢查所有資料表是否都有明確連線。通常,拖曳正確的欄位就足以避免意外的交叉連接並返回到 一致的結果.
不平等連結(non-equi JOIN)
連接不一定基於相等性。您可以使用 >、<、>=、<= 或 <> 等運算子來連接範圍、標誌或更複雜的條件。在 Access 中,這些類型的連接並非從視覺視圖設計的:您必須切換到 SQL視圖,找到 = 運算子並將其替換為所需的運算子。重要:如果將其變更為不等式,則可能無法在設計器中重新開啟查詢,直到將運算子還原為 =。
UNION 查詢:堆疊結果與協調類型
當你想要將多個查詢的結果堆疊到一個虛擬表中時,UNION 是完美的黏合劑,只要它們具有相同的列數和相容的類型。當你需要模擬 全外連接 或當您想要在同一視圖中合併不同性質的交易時。
一個典型的案例:你有一個產品交易查詢,你想將一個數量拆分成兩列,分別是「買入」和「賣出」。第一種方法是在不適用的列中使用 0,並將銷售部分與購買部分堆疊在一起。如果你稍後將 0 替換為 空 為了避免顯示零,您可能會遇到副作用:Access 從 UNION 中的第一個 SELECT 語句推斷每一列的資料類型。
如果第一個 SELECT 語句傳回 Null(非數字),Access 可能會「判定」該列為文字或空值,進而影響其餘欄位。如果您嘗試在第一個 SELECT 語句中輸入空字串“”,Access 會將其視為文本,並透過拖曳 將整列轉換為文字 (您會注意到這一點,因為它們在數據表中顯示為左對齊)。
簡單的技巧 強制 Access 將欄位視為數字 並允許 Null 值:使用這樣的表達式,它始終會傳回 Null 但強制對數位輸出進行評估:
IIf(False, 0, Null)
應用於購買和銷售的 UNION, 有效結構 可能是:
SELECT , , , ,
IIf(False, 0, Null) AS Buy, AS Sell
FROM
UNION
SELECT , , , ,
AS Buy, Null AS Sell
FROM
ORDER BY DESC;
進階替代方案:在前面新增定義類型且不傳回行的「範本」SELECT。這是帶有 如果為假,它設定每列的類型而不污染結果:
SELECT 0 AS , Date() AS ,
"" AS , "" AS ,
0 AS Buy, 0 AS Sell
FROM
WHERE False
UNION
SELECT , , , , Null AS Buy, AS Sell
FROM
UNION
SELECT , , , , AS Buy, Null AS Sell
FROM
ORDER BY DESC;
這種方法使 Access 能夠正確識別 具有 Null 的數字類型,避免在 UNION 的任何部分存在空字串時進行不必要的文字轉換。
操作指南:合併兩個分岔的 Access 資料庫
典型場景:兩個人開始將資料輸入備份,現在您有兩個幾乎完全相同但更改不同的檔案。首先要意識到的是,除非您事先做好規劃,否則 Access 不保存“上次修改”字段 每筆記錄自動更新。您可以使用 Now() 和表單事件來新增它,但如果分叉已經發生,您將需要規則來決定每個記錄保留哪個版本。
建議的安全步驟:
- 備份和壓縮/修復:複製所有內容並對每個檔案執行壓縮和修復,從頭開始。
- 審計結構比較表格和字段,確定每個表的主鍵,並記錄關係。如果可能,請新增 LastEditedDate 字段,並使用您掌握的最佳資訊(例如訂單日期、建立日期等)進行填充。
- 解決自動編號衝突如果兩個資料庫共享可能衝突的自動編號 ID,請套用「移位」技巧。將其中一個資料庫中的自動編號欄位變更為數字(長整型),然後執行更新,新增另一個資料庫中的最大 ID。這樣,就可以保證 沒有踩到識別符.
主表中移動 ID 的更新範例如下:將其新增至另一個資料庫中偵測到的最大值。這樣可以避免重複,而且由於 級聯更新 在關係中,子表被引用到新的 ID。
然後,將調整後的資料庫中的所有表格匯入「目標」資料庫,並建立一個 附加資料查詢 合併集合。如果有衝突(相同 ID 但內容不同),則定義一個策略:保留日期最近的記錄,或保留兩者並添加後綴,並將其中一條標記為「需要審核」。
為了偵測重複和衝突,匹配/不匹配的記錄查詢模式非常有用。例如,要尋找另一側不符的記錄:
SELECT A.*
FROM TablaA AS A
LEFT JOIN TablaB AS B
ON A.ID = B.ID
WHERE B.ID IS NULL;
要比較具有相同 ID 的兩個版本,您可以列出感興趣的列不同的行。實際上,建立以下視圖會很方便: “待和解” 當沒有明確的日期欄位時,逐一解決。
最後,在「關係」視窗(工具選單)中檢查關係。包含所有表並通過它們的鍵鏈接它們。啟用設定 級聯更新 當它有意義時:因此,如果您更改主伺服器上的標識符,它會傳播到輔助伺服器並且不會破壞連結。
一次匯入並連接多個表
在某些工作流程中,資料存取視窗可讓您在相同匯入操作中選擇最多五個資料表並定義配對連線。過程包括: 選擇表格,將它們帶到暫存區,並使用公共關鍵字段(例如 CustomerID)將它們兩兩連接起來。如果值匹配,則結果與各個記錄匹配。
在包含兩個以上表的架構中,「左表」是一對表中的第一個,而「右表」是第二個。您可以連結多個連接(客戶與訂單的連接,然後訂單與產品的連接)。請注意,同一個表可以在一個連接中作為左表,在另一個連接中作為右表,取決於連結段。您也可以: 透過多個欄位進行連接 當單一字段不夠獨特時。
需要注意的限制:對於某些資料來源(例如 Apache Drill),視覺化編輯器僅允許連接兩個表。如果您需要連接三個或更多表,請在 SQL模式 並避免在連接聲明中使用括號,因為該特定連接器不支援括號。這是一個非常具體的細節,但了解資料來自異質來源的情況很有用。
消除不正確的組合
如果 Access 建立了您不想要的自動連接,或者您在拖曳欄位時出錯,請安全地將其刪除:在設計網格中,按一下該行並按 Delete,或右鍵單擊並選擇 清除僅保留必要的組合是避免意外交叉和獲得可靠結果的關鍵。
使用 INNER、LEFT 和 RIGHT JOIN 的良好做法
一個經驗法則是使用簡單的過濾器測試每個組合,以檢查它是否會傳回預期的行數。如果在同一個查詢中混合使用 INNER 和 LEFT,並且 Access 標記了歧義,請拆分問題:首先在已儲存的查詢中建立 INNER 部分,然後 使用它作為來源 在諮詢中將應用 LEFT,明確評估順序。
另一個實用技巧:在註解(查詢屬性)中記錄每個連結的作用及其原因。當其他同事打開資料庫時,他們會很高興看到出現異常 RIGHT JOIN 或 不均勻組合 按範圍過濾。
Access 日常使用的 SQL 技巧
除了上述模式(IIf(False,0,Null) 和帶有 WHERE False 的 SELECT 範本)之外,請記住,在 Access 中,您可以在連接中使用關係運算子來解決日期或段重疊的情況。一個合適的不等式通常可以取代 複雜子查詢 並允許您準確地引入您需要的行集。
如果在 UNION 中你想故意保留重複的行(例如,因為你需要計算出現次數),則將 UNION 替換為 全聯盟Access 使用 UNION 刪除重複項,但不使用 UNION ALL 刪除重複項,這取決於您的最終報告。
附加功能:使用 VBA 合併 Access 中的 PDF(無需 Acrobat)
有些人需要提取多個 PDF 報表,然後從 Access 中將它們合併成一個。如果您沒有 Adobe Acrobat,可以使用 VBA 實用程序,只需幾行程式碼即可解決此問題。一種流行的方法是開發人員方法。 阿爾伯特·卡拉爾它提供了一個簡單的模組,無需依賴 Acrobat 即可從 Access 合併 PDF。這是一個精簡的解決方案,可直接從資料庫流程自動產生統一的檔案或可交付成果。
總體思路是向它傳遞一個路線列表 PDF文件 以及目標輸出;模組負責將它們拼接在一起。這樣,您就可以集成 PDF合併器 作為進一步的步驟,就像啟動查詢或匯出報告一樣。
掌握以上所有內容後,您現在已經掌握了完整的知識圖譜:了解 Access 如何連接資料(INNER/LEFT/RIGHT、不等式和交叉)、使用 UNION 模擬 FULL OUTER、衡量 UNION 查詢中資料類型的影響、調整關係和自動編號以避免衝突,最後完成諸如 PDF 之類的實用自動化操作。掌握這些模組後, 合併多個 Access 文件 即使團隊並行工作,它也從漫長的冒險變成了一個可控且可重複的過程。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。