4

データベース テーブルのデータを SQL クエリの新しいデータと同期する必要があります。新しいデータにない現在のエントリを削除し、現在のデータにない新しいエントリを挿入する必要があります。この疑似コードを使用して、Javaでこれを行うことができました:

// 1) get all data in database and store it in list (currentList)
// 2) get new data obtained through sql query and store it in list (newList)
// 3) sync both list

for(entry : currentList) {
    if(newList.contains(entry))
        finalList.add(entry) 
}

for(entry : newList) {
    if(!finalList.contains(entry))
        finalList.add(entry)
}

// 4) delete all data from DB
// 5) insert finalList data to DB

正常に動作しますが、新しいエントリを挿入して新しいデータに見つからないエントリを削除するのではなく、すべてを削除してリスト全体を再挿入するため、大量のデータを処理するときにパフォーマンスの問題が発生すると思います。

これを行うためのより良い方法を提案できますか? データの同期を処理できる SQL クエリを作成することは可能ですか?

4

2 に答える 2

1

MERGEを見てください。

この構成により、既存のレコードを更新するか、新しいレコードを追加する条件を指定できます。

基本的には次のようになります。

MERGE 
   INTO target_table
   USING source_table
 ON (some condition)
WHEN MATCHED 
     ( UPDATE some_update_statement )
WHEN NOT MATCHED 
     ( INSERT some_insert_statement )
于 2013-03-21T10:41:33.597 に答える
0

これらの操作をストアド プロシージャで実行して、DB トラフィックを不必要に増加させないようにすることもできます。

ただし、これは、膨大な量のエントリ (数百万のエントリなど) や、各エントリが非常に大きい場合には機能しません。この場合、ライアンが上で指摘したように MERGE 操作を使用してみてください。

次のPL/SQL疑似コードを検討してください(ユースケースに応じて変更する必要がある場合があります):

PROCEDURE replace_with_list (newList) AS
BEGIN
  /* Delete all the entries that are not present in the newList (e.g. by ID) */
  /* Insert all the entries that present in newList and not present in your table  */
END;
于 2013-03-21T10:53:43.610 に答える