1

我正在尝试通过使用 ODBC 连接从远程 PostgreSQL 数据库中提取数据来更新本地 Access 2010 表。当我在 Access 更新查询中手动指定WHERE条件时,我可以在数据库服务器上看到有限数量的行正在传递给 Access。但是,当我WHERE根据本地 Access 表中的最后一行使条件动态化时,整个表似乎被拉入 Access 并且条件应用到内存中(我假设,因为它永远不会完成)。

例如,此查询仅从远程数据库中获取 2012 行,我可以WHERE在删除服务器上看到该子句:

INSERT INTO local (dt, latitude, longitude)
SELECT dt, latitude, longitude
FROM remote_odbc
WHERE remote_odbc.dt > #2011-12-31 23:59:59#;

但我真正想要的是查看dt本地表中的最后一个日期时间(),并且只从远程数据库中检索这些行。

这是我尝试过的:

INSERT INTO local (dt, latitude, longitude)
SELECT dt, latitude, longitude
FROM remote_odbc, (SELECT max(dt) AS max_dt FROM local) AS sub
WHERE remote_odbc.dt > max_dt;

当我这样做时,在服务器上运行的查询根本没有WHERE子句,这让我认为 Access 正在检索整个远程表,然后在WHERE本地应用该子句。表太大,互联网太慢,不实用。

如何重写我的更新查询,以便它只通过 ODBC 链接检索我想要的行?

4

1 回答 1

1

“FROM remote_odbc, (...) AS sub”让我怀疑这是问题的原因。试试这个INSERT语句......

INSERT INTO local (dt, latitude, longitude)
SELECT dt, latitude, longitude
FROM remote_odbc
WHERE remote_odbc.dt > DMax("dt", "local");

由于您报告该建议并未限制发送回 Access 的服务器行,因此请使用参数查询将单个日期/时间值放入WHERE子句中。以下过程可能不太适合您当前的应用程序上下文,但我提供它更像是一个诊断测试......看看我们是否可以让某些东西正常工作。

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim dteLast As Date
Dim strInsert As String

dteLast = DMax("dt", "local")
Debug.Print "dteLast: " & dteLast
Set db = CurrentDb
strInsert = "PARAMETERS which_date DateTime;" & vbCrLf & _
    "INSERT INTO local (dt, latitude, longitude)" & vbCrLf & _
    "SELECT dt, latitude, longitude" & vbCrLf & _
    "FROM remote_odbc" & vbCrLf & _
    "WHERE remote_odbc.dt > which_date;"
Debug.Print "strInsert:" & vbCrLf & strInsert
Set qdf = db.CreateQueryDef("", strInsert)
qdf.Parameters("which_date") = dteLast
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing

请注意,代码未经测试,因为我没有您的表格和示例数据可供使用。但是,它从 Access 2007 编译时不会出错。

于 2012-09-26T00:32:52.863 回答