私の目的はこれです:
多くの行を持つSELECT
データベースで実行したいクエリがあります。このクエリは大量の結果を生成するため、各反復で処理された最後の行がどこになるかを反復しLIMIT 1000
て実行することを考えていました。OFFSET ?
?
例えば:
- 行 1 ~ 1000 を取得
- 行 1001 ~ 2000 を取得
- 行 2001 ~ 3000 を取得
- 行 3001 ~ 4000 を取得
- ...
私は、新しい反復ごとに最後の反復の行を新しい反復の行として設定するループでそれを行うことを考えていましたOFFSET
(例:上に示すようOFFSET 1001
に、、OFFSET 2001
など)。
私は JDBC を初めて使用するので、これは正しい方法ですか? PreparedStatement
もしそうなら、それを実行して各反復の結果を取得する必要があるときにどのように再利用しますか?
これが正しい方法ではない場合、正しい方法は何ですか?
編集:これが私の現在のコードです:
private static void import(Date from, Date to) throws Exception {
PreparedStatement p = connect.prepareStatement(statement);
p.setInt(1, 0);
p.add
ResultSet results;
for (int i=0; i< WAVES; i++) {
results = p.executeQuery();
Integer lastRow = importFrom(results);
p.setInt(1, lastRow.intValue()+1);
results.close();
}
p.close();
}
編集 2 : SQL 文字列は次のとおりです。
SELECT
item.aitem_id, item.action_type, item.user_id, item.pid, item.pr_id, item.action_time, item.notes, item.screen, item.vid, item.lo_id,
vals.value_name, vals.simple_int_value, vals.simple_double_value, vals.simple_date_value, vals.simple_string_value,
data.version_id, data.prev_version_id
FROM mySchema.aitems item
JOIN mySchema.avalues vals ON item.aitem_id=vals.aitem_id
JOIN mySchema.adata data ON item.aitem_id=data.aitem_id
LIMIT 1000 OFFSET ?;
コードと SQL の両方を変更して、OFFSET
.