Ms-Access

如何將我的 Access 表上的每條記錄變成 6 條記錄?

  • November 25, 2017

我整天都在用Google搜尋一個問題:請幫忙。

我有一張像下面這樣的表格,我想擴展它,將每條記錄變成 6 條記錄。

TableName:
--------------------------------------------------
|  col1  |   col2   |          col3         |
-------------------------------------------------
|    A1  |  abcd    |                       |
-------------------------------------------------
|    B2  |  efgh    |                       |
--------------------------------------------------
|    C3  |   ijk    |                       |
-------------------------------------------------- 

它最終應該看起來像這樣:

--------------------------------------------------
|  col1  |   col2   |          col3       |
-------------------------------------------------
|    A1  |  abcd    |         1           |
-------------------------------------------------
|    A1  |  abcd    |         2           |
-------------------------------------------------
|    A1  |  abcd    |         3           |
-------------------------------------------------
|    B2  |  efgh    |         1           |
--------------------------------------------------
|    B2  |  efgh    |         2           |
-------------------------------------------------
|    B2  |  efgh    |         3           |
-------------------------------------------------
|    C3  |   ijk    |         1           |
--------------------------------------------------

我不知道該怎麼做,因為我剛剛開始使用 Access。到目前為止,我已經製作了一個應該記錄的數據宏,對其進行編輯以在 col3 中添加資訊,然後再創建 5 個。像這樣

部分數據宏

然後我讓這個宏從表的頂部開始,執行數據宏,然後轉到下一條記錄,直到所有 430 都展開:

正常宏

當我去 TableName 並嘗試執行宏時,我得到

沒有執行操作的數據上下文。使用 RunDataMacro 操作執行呼叫 DeleteRecord 或 EditRecord 且未指定別名的數據宏可能會導致此錯誤。

我哪裡出錯了?

對這個問題的一個很好的答案可能是充分澄清這個問題,以便幾乎沒有訪問經驗的人 - 我 - 可以將它應用於這種略有不同的情況。

注意:在實施將列值複製到新行中的任何解決方案之前,請考慮正確規範化的表模式。規範化表消除了重複數據,並具有將多個錶鍊接在一起的適當主鍵和外鍵(而不是試圖將所有數據強製到一個表中)。將值複製並保存到表的多行中會讓人頭疼,因為必須使行保持同步,或者以後在應該包含相同值的行中遇到不匹配的數據。 在需要時使用適當的 JOIN 查詢,規範化表始終可以根據需要生成多行

生成擴展行的最佳方法是使用另一個(臨時)表。例如,創建一個名為

$$ TempTable $$具有以下值:

Col3
----
1
2
3

現在在兩個表之間做一個 CROSS JOIN。交叉連接產生兩個表中所有行的笛卡爾積。這意味著它返回每個表中所有可能的行組合。(訪問

$$ and I think for any other standard SQL relational database system $$預設行為是始終為不受其他 JOIN 約束的所有行生成笛卡爾積。)在 Access SQL 中,CROSS JOINS 是通過在不指定任何連接類型的情況下列出表來完成的——以逗號分隔的表列表:

SELECT DT.Col1, DT.Col2, TT.Col3
FROM DataTable As DT, TempTable As TT
WHERE DT.Col3 Is NULL
ORDER BY DT.Col1, DT.Col2, TT.Col3

該查詢將僅返回擴展的行集,但不會更新原始表。


如果您堅持將新行保存到原始表中,您可以使用基於前一個查詢的幾個更新查詢來做到這一點。

請注意,我添加了條件WHERE DT.Col3 Is NULL以避免重複已處理的行。

  1. 將先前列出的查詢另存為命名查詢,例如[Expanded].
  2. 添加新行以[Col3] >= 2使用以下 INSERT 命令:

INSERT INTO DataTable ( Col1, Col2, Col3)
SELECT Expanded.Col1, Expanded.Col2, Expanded.Col3
FROM Expanded
WHERE Expanded.Col3 >= 2

  1. 1 -> [Col3]使用以下 UPDATE 命令更新原始行:

UPDATE DataTable SET DataTable.Col3 = 1
WHERE DataTable.Col3 Is Null;

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