我正在尝试通过使用ODBC连接从远程PostgreSQL数据库中提取数据来更新本地Access 2010表。当我在Access更新查询中手动指定WHERE
条件时,我可以在数据库服务器上看到有限数量的行传递给Access。但是,当我根据本地Access表中的最后一行使WHERE
条件动态化---整个表似乎被拉入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链接检索我想要的行?
答案 0 :(得分: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中编译时没有错误。