我正在使用Excel-VBA将ADO连接到MS-Access数据库。它正在执行Access数据库中的存储过程。返回有大约900条记录,包含13个字段。我使用以下VBA代码:
Dim RS As ADODB.Recordset
Call OpenDatabase 'Subroutine that opens an ADO connection: DatabaseName
Set RS = DatabaseName.Execute("SELECT * FROM My_Procedure") 'This DOES return a recordset
Do While Not RS.EOF
Debug.Print RS(0)
RS.MoveNext
Loop
Call CloseDatabase 'Another sub
数据库连接在这里:
Sub OpenDatabase
Dim ConnString as String
Set DB = New ADODB.Connection
ConnString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & My_DB_Path & "; Persist Security Info=False;"
With DB
.ConnectionString = ConnString
.ConnectionTimeout = 10
.Open
End With
End Sub
以下是名称为generalized的查询:
SELECT Col1, Col2, Col3,
(SELECT Col4 FROM t2 where t2.Col1 = t1.Col1 AND t2.Col2 = t1.Col2 and Col4 IS NOT NULL) As Col4,
(SELECT Col5 FROM t2 where t2.Col1 = t1.Col1 AND t2.Col2 = t1.Col2 and Col5 IS NOT NULL) As Col5,
... (Same through Col13)
FROM t1
在存储过程中,字段1,2和3都非常简单,一切都快速移动。但是,字段#4-13遗憾的是所有更复杂的select语句,这似乎是问题的一部分
这不是一个更好的方法,但在MS-Access的限制范围内,这是我必须做的,以我需要呈现它的方式格式化数据。
当我在Access中运行此过程时,计算并显示DataSheet视图中的所有内容可能需要15-20秒。当我运行上面的VBA代码时,Do循环大约需要45秒来打印所有900行RS(0,1,2),但是使用Debug.Print RS(3> 12),它需要超过280每场的秒数。我怀疑每次我在VBA中要求它重新计算所有这些嵌入式子查询,但我不知道为什么。
理想情况下,我希望Access运行该过程并生成结果,我只需将每条记录拉入VBA变量以进行进一步处理。有关如何加快检索过程的任何想法吗?
编辑添加样本数据
这是查询正在运行的数据的一般化示例,以及完成后应该看起来的样子。输入就像:
Col1|Col2|Col3|Col4|Col5|...
A |01 |X | |
A |01 | |Y |
A |02 |X | |
A |02 | |Y |
B |01 | |X |
B |02 | |X |
B |02 |Y | |
B |02 | | |Z
输出就像:
Col1|Col2|Col3|Col4|Col5|...
A |01 |X |Y |
A |02 |X |Y |
B |01 | |X |
B |02 |Y |X |Z
答案 0 :(得分:1)
从您当前的示例数据和所需结果中,您当然可以优化查询。现在,您运行9个单独的子查询以从每个相应列中检索非空值。简单地说,在列3-13上使用MAX()
运行聚合查询,分组在前两列:
SELECT Col1, Col2, Max(Col3) As C3, Max(Col4) As C4, Max(Col5) As C5, ...
Max(Col13) As C13
FROM t1
GROUP BY Col1, Col2