通過連結表連接具有不同欄位的兩個表
我是 Access (2013) 的新手。
我正在做一些歷史研究,並認為使用 Access 會更容易。到目前為止,我已經創建了兩個表。
People
, 有關他們的詳細資訊Events
(歷史)。兩者都有不同的領域。
我可以創建第三個表來整理前兩個表中的所有資訊嗎?
因此,我可以“組織”按順序顯示的日期。(可能需要查看 DOB 和 Event Date 以在 name 欄位名稱下合併才能執行此操作?)
我已經上傳了文件給你看看它是否有幫助。我試圖在發布之前搜尋答案,但我所看到的沒有任何東西被拋出。也沒有編碼經驗,所以這對我來說是全新的。
先感謝您
這直接回答了您關於“整理”記錄和“合併”欄位的問題。這不是 joanolo 的答案所獨有的,而是您可以結合這兩種技術來提供更豐富的數據集。您提到了“第三張表”,但您實際上只需要查詢來組合現有表。如果您需要儲存其他資訊或創建必要的連結作為 joanolo 的答案詳細資訊,確實有時您需要其他表格。否則,用於組合數據的額外表只會導致重複資訊,這需要雙倍的工作來維護,並且如果維護不當可能會產生差異(換句話說,避免在表之間複製數據)。
另一方面,查詢始終從目前數據中提取,因此始終是最新的。以下一組範例查詢
- 使用字元串連接組合欄位。 還有其他方法可以組合數據。
- 有些欄位可能不應該合併,對於某些記錄應該留空。要將某個查詢的欄位留空,請添加這樣的欄位
Null As [Field Name]
- 使用 SQL
AS
關鍵字重命名欄位。- 使用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 程式技術。這是我將如何進行的概述,但如果您有困難,您可能需要探索這個問題和答案之外的可能性,
- 創建一個以組合時間線查詢作為記錄源
的主窗體。
- 與其他所需欄位一起,添加控制項$$ IDMixed $$和$$ IDType $$欄位,但可能使它們隱藏(即可見 = 假)。
- 為每種表類型
創建單獨的子表單:人員和事件
- 子窗體實際上只是一個普通窗體,只是它被設計為顯示在另一個窗體的子窗體控制項中。您可以像任何其他形式一樣創建和設計它。換句話說,沒有特殊的“子表單”類型。
- 確保為$$ ID $$每個表單上都有欄位,即使您將它們隱藏起來。
- 將兩個子窗體添加到主窗體。
- 將它們都隱藏起來:Visible = False。
- 定位它們,使它們彼此重疊。
- 在子表單屬性表中,將連結主欄位設置為
IDMixed
,將連結子欄位設置為ID
。
- 在主窗體的 OnCurrent 事件中,添加以下 VBA 程式碼。請注意,這只是一個模板。至少,需要更新控制項的確切名稱。
- 還有其他更高級的技術,可能更優雅或更高效,但它們需要更高級的程式技術和對複雜訪問的理解。
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 語句中,但單獨保存它們可以更容易地查看、編輯和單獨驗證每個單獨的查詢。從技術上講,並不要求每個查詢的列具有相同的名稱,只要它們具有相同的列數並且具有兼容的數據類型即可。結果查詢將從聯合中的第一個查詢中獲取列名。