【发布时间】:2019-07-24 15:02:49
【问题描述】:
我在 Excel 工作簿中有 3 个可以使用 SQL 访问的表。
Inscriptions 表包含 AGENT_ID 和 MLS_ID,PHOTOS 表包含 MLS_ID 的最近提要中的所有照片,PHOTOS_CURRENT 包含当前系统中的所有照片MLS_ID.
目标是查找新提要中是否有当前不在系统中的照片。
我尝试使用NOT EXISTS 和NOT IN 方法进行查询。两者都需要很长时间才能运行(有时每个 AGENT_ID 需要 2 分钟)。
NOT EXISTS 方法:
sqlQuery = "SELECT DISTINCT INSCR.MLS_ID FROM [INSCRIPTIONS_CURRENT$] INSCR, [PHOTOS$] P1 " & _
"WHERE INSCR.AGENT_ID = " & inpAgentId & _
" AND INSCR.MLS_ID = P1.MLS_ID AND NOT exists (select 1 from [PHOTOS_CURRENT$] PC1 where PC1.MLS_ID = P1.MLS_ID and PC1.PHOTO_ID = P1.PHOTO_ID)"
NOT IN 方法:
sqlQuery = "SELECT DISTINCT INSCR.MLS_ID FROM [INSCRIPTIONS_CURRENT$] INSCR, [PHOTOS$] P1 " & _
"WHERE INSCR.AGENT_ID = " & inpAgentId & _
" AND INSCR.MLS_ID = P1.MLS_ID AND INSCR.MLS_ID NOT IN (select MLS_ID from [PHOTOS_CURRENT$] PC1 where PC1.MLS_ID = P1.MLS_ID and PC1.PHOTO_ID = P1.PHOTO_ID)"
数据库连接如下:
Sub Connect()
Set objConnection = CreateObject("ADODB.Connection")
objConnection.CommandTimeout = 120
End Sub
查询发送到程序处理如下:
Function select_query(sqlQuery As String) As ADODB.Recordset
Dim objRecordset As ADODB.Recordset
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1
Set objRecordset = CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
objRecordset.Open sqlQuery, objConnection, adOpenStatic, adLockOptimistic,
adCmdText
Set select_query = objRecordset
End Function
有什么提高性能的建议吗?
【问题讨论】:
-
桌子有多大?
-
@TimWilliams PHOTOS 和 PHOTOS_CURRENT 中约有 20,000 条记录,INSCRIPTIONS 中约有 2,000 条记录
-
请提供更完整的代码块而不是行 sn-ps 以便我们可以看到整个过程。否则,请记住 excel is not a database,因此请使用与其兄弟
ms access类似的实际名称,它可以索引字段以加快表扫描! -
@Parfait 在我已经提供的内容中添加任何其他内容没有多大意义。如果查询找到任何记录,则将它们插入输出数组并发送回调用例程。我知道 Excel 不是一个真正的数据库,我在公司强加给我的限制条件下工作。这个 Excel 有大约 20 个工作表,用作数据库,取它或留下它。我向公司提出了改进建议,但当他们做出正确的决定时,我必须让这段代码工作。
-
如果您在循环中运行它,您似乎可以从
NOT EXISTS查询中创建一个表并加入它,而不是为每个代理重复该查询。