想利用ACCESS來從「同欄位不同內容的多個檔案」中查詢特定幾筆資料

各位好:

之前我提過access的問題,但提問不夠明確所以沒有問到正確的方向。

我是想利用ACCESS來從「多個檔案、同欄位、不同內容」的中查詢特定幾筆資料(如例圖)

想利用ACCESS來從「同欄位不同內容的多個檔案」中查詢特定幾筆資料

舉例來說,就像是一所五萬人的大學中,一個系一個班就有一筆個資檔案,每個檔案都包含了「學號姓名電話地址系所」等,然後我今天如果將所有的檔案都「一個一個匯入access了,但我今天要的是「將下列20組學號的學生個資全部列出」(狀況一)(類似例圖狀況)

想利用ACCESS來從「同欄位不同內容的多個檔案」中查詢特定幾筆資料

這種情況下的話,在ACCESS上要怎麼做呢?

因為我目前看到的教學都是屬於「同欄位(如姓名、編號)資料配合不同檔案」例如說學生資料來說,五萬筆都已經建立好,但是檔案分配方式是「學號+姓名」一個檔案,「學號+住址」一個檔案,「學號+電話」一個檔案,利用學號連結來設計查詢找到不同檔案(狀況二),這點我目前是明白了。(類似例圖狀況)

想利用ACCESS來從「同欄位不同內容的多個檔案」中查詢特定幾筆資料

但如果我想查詢狀況一的話,Access是否有辦法做此查詢呢?。(例圖完全觀念錯誤無法查詢我想要的東西)

想利用ACCESS來從「同欄位不同內容的多個檔案」中查詢特定幾筆資料

感謝各位
2021-07-24 14:21 發佈
稻草人到處草人 wrote:
各位好:之前我提過access...(恕刪)


去找ACCESS基本學習看一遍吧
先學會怎麼建立資料
有資料就可以查詢
以下是利用查詢來查一大筆資料中符合條件者,預設學員學號不重複
1.基本上你要把所有的EXCEL資料,匯入同一個資料表,叫做資料表A,假設[學號]當主索引(不重複)
2.接下來新增一個你要查詢的資料表B,內建一個流水號當主索引,及[查學號]的欄位
3.新增查詢C,來源選擇資料夾A+B,關聯連接資料表A的[學號]以及資料表B的[查學號]
4.顯示欄位選擇資料表B的[查學號]及資料表A的全部
5.在資料表B填入的學號,都可以在查詢C裡看到資料表A相關資料
以上是很基本的查詢功能,你之前提問的,ATB回答的就是類似上述這樣的,你試試看!!
zchiang wrote:
以下是利用查詢來查一(恕刪)


謝謝,我原本最希望避免的就是「大量資料都匯入同一個資料表內」這個步驟
原本希望至少是分開的,但看來似乎是真的只能這樣了?

如果未來每天都有新增資料的時候,就是每天都要把資料「匯入到同一個資料表內」對嗎?

我最希望的就是避免這步驟,看來是沒辦法?

因為假設可以分開資料表的話,我至少還可以依照月份的來使用「已儲存的匯入」來更新

這個問題有辦法解決嗎?
稻草人到處草人 wrote:
因為假設可以分開資料表的話,我至少還可以依照月份的來使用「已儲存的匯入」來更新

這個問題有辦法解決嗎?


BY月份建立資料表??
不建議
還是匯入同一資料表
用資料庫要去設計表單讓人直接輸入資料
不然就是用VBA把EXCEL資料匯入ACCESS
zchiang

EXCEL合併的功能我不熟,不過你可以參考此文章,希望對你有幫助!!https://reurl.cc/XWglGM

2021-07-24 20:31
稻草人到處草人

沒問題,我有合併最快的方式,只是資料量太龐大而已,謝謝~

2021-07-26 11:26
每個月一個檔嗎?

要用暫存檔...
1.creat temp table 建立暫存表
2.select ... into temptable 把每個月符合的資料放入暫存表(用迴圈)
3.select ... from temptable... 由暫存表把資料列出
chuway wrote:
每個月一個檔嗎?


他要的大概是像這樣,一個檔案佔一個access資料表(table)










'簡易範例,請參考
'測試用access資料庫,請自行照上面圖片的格式建立(名稱暫訂test.accdb),存放位置同excel檔
'程式碼打完後,需先存檔關閉後再開

Sub List_All_Table()


Dim DB As Object, RS As Object, All_Table As Object, Table, Skip_Table, Sql As String, lastrow As Double, ttt As Double

Set DB = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
Set All_Table = CreateObject("ADOX.catalog")

DB.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & ThisWorkbook.Path & "\test.accdb" & ";"
All_Table.ActiveConnection = DB

Cells.Clear
Application.ScreenUpdating = False


Skip_Table = Array("資料表1", "資料表2") '跳過格式不同的表格,(,逗點隔開)
查詢 = "aaa" '暫訂查收件人
lastrow = 1
Sql = ""
Range("a1:c1") = Array(查詢, "日期", "單號")
ttt = Timer


If All_Table.tables.Count < 50 Then

'少量資料表 UNION ALL,只需使用sql查詢1次
For i = 0 To All_Table.tables.Count - 1

If All_Table.tables.Item(i).Type = "TABLE" And Join(Filter(Skip_Table, All_Table.tables.Item(i).Name)) = "" Then
Sql = Sql & "SELECT 日期,單號 from " & All_Table.tables.Item(i).Name & " WHERE 收件人='" & 查詢 & "'" & " UNION ALL "
End If

Next i

Sql = Left(Sql, Len(Sql) - 11)
RS.Open Sql, DB, 3, 3
Cells(lastrow + 1, 2).CopyFromRecordset RS
RS.Close

Else

'大量資料表,N次sql查詢
For i = 0 To All_Table.tables.Count - 1

If All_Table.tables.Item(i).Type = "TABLE" And Join(Filter(Skip_Table, All_Table.tables.Item(i).Name)) = "" Then

Sql = "SELECT 日期,單號 from " & All_Table.tables.Item(i).Name & " WHERE 收件人='" & 查詢 & "'"
RS.Open Sql, DB, 3, 3
Cells(lastrow + 1, 2).CopyFromRecordset RS
lastrow = lastrow + RS.RecordCount
RS.Close

End If

Next i

End If


Debug.Print Timer - ttt & "s"
Application.ScreenUpdating = True

DB.Close
Set All_Table = Nothing
Set DB = Nothing
Set RS = Nothing

End Sub





但這種會根據日期、時間,累加性質的資料
且資料表名稱跟似乎內容沒什麼關係,是多餘的分類

單純是資料內容搜尋,無法用關聯性查詢
分類太多,反而會對查詢速度造成影響

少量資料表,還可以用 UNION ALL 來合併查詢
但如果是大量資料表+查詢條件多,那查詢速度會變的很慘


建議一個比較簡單又不影響速度的方法
=>全部資料放在同一個資料表,一直新增下去(理由同5樓)
之後要做什麼分類、月、年、時間、寄件人... 之類的報表,再用sql查詢產生就好
稻草人到處草人

感謝Snare大,如果用這種方式分表格搜尋起來更慢的話確實違背初衷了,我再想想辦法看如果每日都有更新資料的情況下怎麼合併或匯入表格比較簡易好了,感謝~[謝謝指教][謝謝][謝謝]

2021-07-26 11:31
Select .... union .... 不知道合不合你用.

https://stackoverflow.com/questions/5452233/where-statement-after-a-union-in-sql

https://ithelp.ithome.com.tw/questions/10185515
snare

union 大量資料慢會移除重複,不太適合有重複資料要查的表格(範例中是用union all)。但union、union all,都有一個問題,在sql合併查詢中,資料表數量有上限,且語法長度有限制

2021-07-26 15:25
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?