如何在Power Query中针对多份Access数据库执行自定义SQL语句(无需VBA)
解决方法:Power Query中用统一SQL查询多个同结构Access数据库
1. 集中存储SQL查询语句
在当前Excel工作簿新建一个工作表(比如命名为SQL_Config),在A1单元格写入你的4表关联SQL语句,示例:
SELECT t1.ID, t1.Name, t2.Details, t3.Status, t4.Category FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.RefID INNER JOIN Table3 t3 ON t1.ID = t3.RefID INNER JOIN Table4 t4 ON t1.ID = t4.RefID
选中A1单元格,点击公式选项卡→定义名称,给这个单元格命名为CoreQuery,方便Power Query读取。
2. 创建Power Query自定义函数
打开Power Query编辑器,点击主页→新建源→空白查询,将查询重命名为fn_FetchAccessData,在公式栏替换为以下M代码:
(filePath as text) => let // 读取预先定义的SQL语句 SQL_Statement = Excel.CurrentWorkbook(){[Name="CoreQuery"]}[Content]{0}[Column1], // 建立Access数据库连接 Access_Connection = OleDb.DataSource(filePath, [Provider="Microsoft.ACE.OLEDB.12.0"]), // 执行SQL查询并返回结果 Query_Result = Access_Connection{[Schema="", Item=SQL_Statement]}[Data] in Query_Result
注:需对应Office位数安装Microsoft ACE OLEDB驱动(32位Office装32位驱动,64位装64位驱动)。
3. 批量调用函数获取4个数据库的数据
回到Power Query编辑器,新建空白查询,输入以下代码(替换为你的4个MDB文件路径):
let // 定义4个Access文件路径 File_Paths = { "C:\Data\DB1.mdb", "C:\Data\DB2.mdb", "C:\Data\DB3.mdb", "C:\Data\DB4.mdb" }, // 对每个路径调用自定义函数 All_Results = List.Transform(File_Paths, each fn_FetchAccessData(_)), // 给每个数据集添加来源标识(方便对比) Add_Source_Tag = List.Zip({All_Results, File_Paths}) |> List.Transform( (x) => Table.AddColumn(x{0}, "Source_DB", each Text.From(x{1})) ), // 合并为单表(也可选择分别加载每个数据集) Combined_Table = Table.Combine(Add_Source_Tag) in Combined_Table
完成后可将结果加载到Excel工作表,直接对比4个数据库的查询结果。
维护说明
后续修改SQL时,直接编辑SQL_Config工作表A1单元格的内容,刷新Power Query即可,所有关联查询会自动同步更新,无需逐个修改。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

