【问题标题】:Filtering a Million Records to 100,000 from two different sources将来自两个不同来源的一百万条记录过滤到 100,000 条
【发布时间】:2014-12-24 16:49:06
【问题描述】:

我有一个项目,我想在 Excel VBA 中自动报告一大组数据。基本上我有一个超过 1,000,000 条记录的数据库,我想从中提取约 100,000 条记录。我拥有 100,000 个项目的唯一方法是在 Excel 工作表中,我无法将其转储到同一个数据库中进行过滤或转储到同一服务器上的临时表中。 有没有办法将 Excel 电子表格值视为数据库并在 VBA 的 SQL 查询中调用它?我不想使用循环,因为数据库响应已经很差了。

想法?

谢谢。

编辑 - 根据一条评论,我对“循环不好”的假设是不正确的。这是真的?循环遍历 ID 是否必须轮询数据库 100,000 次,还是将其视为单个数据拉取?

【问题讨论】:

  • 我不清楚您要做什么:您的标题谈到了 2 个不同的数据源,但您的问题只提到了 1 个数据源。您正在尝试将 100K excel 记录与数据库中的 1000K 记录连接起来吗?
  • Excel 100k 列表是一个数据源... 1m 条记录在 DB2 数据库中。 100k ID 驻留在 1m 记录中,我正在寻找一种方法来从 DB2 记录集中提取 100K 记录。我认为循环会非常费力,但从下面的 cmets 来看,我可能是错的。我可以通过任何方式从 1m 个 DB2 记录中获取 Excel 表中的 100k 个 ID,而无需将 DB2 中的所有记录加载到 Excel 中。
  • 我建议在您的 db2 数据库中使用一个存储过程,该过程接受 ID 值列表作为输入参数。根据您的数据库中的要求处理值。这会很棘手,因为您可能会遇到某种最大允许数量。然后运行相应的查询。在 vba 中,读取带有 id 字段的列,调用存储过程,并对查询结果做一些事情。
  • 我只能查询DB2数据库。我没有选择在该数据库中存储任何内容。我仅限于查询 DB2。如果我有权制作临时表,这将很容易。啊。也许我只是在以错误的方式思考这个问题。

标签: sql excel vba filter


【解决方案1】:

如果您想使用类似 sql 的语法在工作簿中查询,可以使用 ADODB。

我已经包含了一个 sub to 作为如何执行此操作的示例。你可以像下面这样调用所说的子:

Call queryTable("select top 100000 * from [Sheet6$A1:AI31]", range("Sheet5!A1"))

这将查询位于Sheet6$A1:AI31 范围内的数据(第一行是标题),并将转储从左上角单元格Sheet5!A1 开始的数据。

Sub queryTable(sqlStr As String, destination As Range)
Dim strFile As String
Dim stADO As String
Dim cnt                 As ADODB.Connection
Dim recordcount         As Long
Dim fieldcount          As Long
Dim resultrange         As Range
Dim mydestination       As Range

strFile = ThisWorkbook.FullName

'connection string may need to be altered a little bit depending on your excel version
stADO = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
                            & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

Set cnt = New ADODB.Connection

'Running query
    With cnt
        .CursorLocation = adUseClient
        .Open stADO
        .CommandTimeout = 0
        Set rst = .Execute(sqlStr)
    End With

Set mydestination = destination.Cells(1, 1).Offset(1, 0)

'Copying data (not headers) to destination
mydestination.CopyFromRecordset rst

'Setting some important variables
recordcount = rst.recordcount
fieldcount = rst.Fields.Count

Set range_collection = Range(mydestination.Cells(1, 1).Offset(-1, 0),                  mydestination.Cells(1, 1).Offset(recordcount - 1, fieldcount - 1))

'Copying the headers
For i = 0 To fieldcount - 1
mydestination.Cells(1, 1).Offset(-1, i).value = rst.Fields(i).name
Next i


'Closing everything down
cnt.Close
Set cnt = Nothing


End Sub

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 2012-04-19
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多