1

ODBC 接続を使用してリモートの PostgreSQL データベースからデータを取得して、ローカルの Access 2010 テーブルを更新しようとしています。Access 更新クエリで条件を手動で指定するWHEREと、限られた数の行が Access に渡されていることがデータベース サーバーでわかります。ただし、WHEREローカルの Access テーブルの最後の行に基づいて条件を動的にすると、テーブル全体が Access に取り込まれ、条件がメモリに適用されたように見えます (決して完了しないためだと思います)。

たとえば、このクエリはリモート データベースから 2012 行のみをフェッチWHEREし、remove サーバーで句を確認できます。

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;

これを行うと、サーバーで実行されているクエリには句がまったく含まれていないため、Access がリモート テーブル全体を取得してから、句をローカルに適用しWHEREていると思われます。テーブルが大きすぎ、インターネットが遅すぎて実用的ではありません。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 に答える