Join

通過連結表連接具有不同欄位的兩個表

  • July 31, 2017

我是 Access (2013) 的新手。

我正在做一些歷史研究,並認為使用 Access 會更容易。到目前為止,我已經創建了兩個表。

  1. People, 有關他們的詳細資訊
  2. Events(歷史)。

兩者都有不同的領域。

我可以創建第三個表來整理前兩個表中的所有資訊嗎?

因此,我可以“組織”按順序顯示的日期。(可能需要查看 DOB 和 Event Date 以在 name 欄位名稱下合併才能執行此操作?)

我已經上傳了文件給你看看它是否有幫助。我試圖在發布之前搜尋答案,但我所看到的沒有任何東西被拋出。也沒有編碼經驗,所以這對我來說是全新的。

先感謝您

連結到數據庫文件

這直接回答了您關於“整理”記錄和“合併”欄位的問題。這不是 joanolo 的答案所獨有的,而是您可以結合這兩種技術來提供更豐富的數據集。您提到了“第三張表”,但您實際上只需要查詢來組合現有表。如果您需要儲存其他資訊或創建必要的連結作為 joanolo 的答案詳細資訊,確實有時您需要其他表格。否則,用於組合數據的額外表只會導致重複資訊,這需要雙倍的工作來維護,並且如果維護不當可能會產生差異(換句話說,避免在表之間複製數據)。

另一方面,查詢始終從目前數據中提取,因此始終是最新的。以下一組範例查詢

  1. 使用字元串連接組合欄位。 還有其他方法可以組合數據。
  • 有些欄位可能應該合併,對於某些記錄應該留空。要將某個查詢的欄位留空,請添加這樣的欄位Null As [Field Name]
  1. 使用 SQLAS關鍵字重命名欄位。
  2. 使用SQL 聯合將查詢結果組合成一組可以完全排序的數據。

已保存的查詢

$$ Timeline Events $$:

SELECT
   Events.[ID] As IDMixed,
   "Events" As IDType, 
   Events.[Event Date] AS [Timeline Date],
   [Event Type] & "; " & [Notes] AS [Timeline Details]
FROM Events

已保存的查詢

$$ Timeline People Births $$:

SELECT 
   People.[ID] As IDMixed,
   "People" As IDType, 
   People.DOB AS [Timeline Date], 
   "Born: " & [First Name] & " " & [Surname] AS [Timeline Details]
FROM People
WHERE People.DOB Is Not Null

保存查詢

$$ Timeline People Deaths $$:

SELECT
   People.[ID] As IDMixed,
   "People" As IDType, 
   People.DOD AS [Timeline Date], 
   "Died: " & [First Name] & " " & [Surname] AS [Timeline Details]
FROM People
WHERE People.DOD Is Not Null

現在總共:

SELECT  [IDMixed], [IDType], [Timeline Date], [Timeline Details]
FROM [Timeline Events]
UNION
SELECT [IDMixed], [IDType], [Timeline Date], [Timeline Details]
FROM [Timeline People Births]
UNION
SELECT [IDMixed], [IDType], [Timeline Date], [Timeline Details]
FROM [Timeline People Deaths]
ORDER BY [Timeline Date]

對源表的引用不僅需要ID,還需要指示源表的東西。為了呈現相關記錄,例如在使用者選擇時間線事件時顯示事件詳細資訊,通常的技術(基於適當的規範化表設計)是創建一個綁定子表單,該子表單可以自動顯示來自另一個表或查詢的相關記錄. 但這種技術也僅在外鍵(例如 ID 值)引用單個表時才有效。沒有在多個相關表之間切換的內置行為,就像在這種情況下使用組合數據一樣。最終它將需要更高級的 Access 程式技術。這是我將如何進行的概述,但如果您有困難,您可能需要探索這個問題和答案之外的可能性,

  1. 創建一個以組合時間線查詢作為記錄源

主窗體。

  • 與其他所需欄位一起,添加控制項$$ IDMixed $$和$$ IDType $$欄位,但可能使它們隱藏(即可見 = 假)。
  1. 為每種表類型

創建單獨的子表單:人員和事件

  • 子窗體實際上只是一個普通窗體,只是它被設計為顯示在另一個窗體的子窗體控制項中。您可以像任何其他形式一樣創建和設計它。換句話說,沒有特殊的“子表單”類型。
  • 確保為$$ ID $$每個表單上都有欄位,即使您將它們隱藏起來。
  1. 將兩個子窗體添加到主窗體。
  • 將它們都隱藏起來:Visible = False。
  • 定位它們,使它們彼此重疊。
  • 在子表單屬性表中,將連結主欄位設置為IDMixed,將連結子欄位設置為ID
  1. 在主窗體的 OnCurrent 事件中,添加以下 VBA 程式碼。請注意,這只是一個模板。至少,需要更新控制項的確切名稱。
  2. 還有其他更高級的技術,可能更優雅或更高效,但它們需要更高級的程式技術和對複雜訪問的理解。

Private Sub Form_OnCurrent()
   On Error Resume Next
   If Me!IDType = "Events" Then
       Me.EventsSubForm.Visible = True
       Me.PeopleSubForm.Visible = False
   ElseIf Me!IDType = "People" Then
       Me.EventsSubForm.Visible = False
       Me.PeopleSubForm.Visible = True
   End If
   If Err.Number <> 0 Then
       Me.EventsSubForm.Visible = False
       Me.PeopleSubForm.Visible = False
   End If
End Sub    

除了這些查詢概述的一般結構外,您包含的特定欄位完全由您的設計和選擇。我假設您會想要包含更多類型的時間線日期,但您所做的只是添加另一個查詢並通過附加另一個 UNION 來組合它。

關於 Union的注意事項:不需要單獨保存其他查詢——原始查詢中的 SQL 可以直接包含在 UNION 語句中,但單獨保存它們可以更容易地查看、編輯和單獨驗證每個單獨的查詢。從技術上講,並不要求每個查詢的列具有相同的名稱,只要它們具有相同的列數並且具有兼容的數據類型即可。結果查詢將從聯合中的第一個查詢中獲取列名。

引用自:https://dba.stackexchange.com/questions/182174