私はテーブルのデータを選択し、そのテーブルからいくつかの行を選択し、それらの行を別の同じテーブルに挿入するクエリを作成しています。他のデータベースを選択してから、proignを繰り返して、orignalテーブルから次の行数を選択します。これは、SQLサーバー用の.NETRow_Numberを使用してそのテーブルのselectの結果を挿入します。
にループを入れて
$" INSERT INTO {destination-table}
SELECT * FROM {original-table}
WHERE ROWID IN (SELECT B.RID
FROM (SELECT ROWID AS RID, rownum as RID2
FROM {original-table}
WHERE {Where Claus}
AND ROWNUM <= {recordsPerStatement * iteration}
) B WHERE RID2 > {recordsPerStatement * (iteration - 1)})"
しかし、私は取得に失敗:
参考のためにが、これは私が(すでにOracleのためにそれを構築する)やろうものですこれは終わった。私が取得するデータ:
$" Select B.* from (Select A.* from (Select Row_NUMBER()
OVER (order by %%physloc%%) As RowID, {original-table}.* FROM
{original-table} where {where-claus})
A Where A.RowID between {recordsPerStatement * (iteration - 1)}
AND {recordsPerStatement * iteration} B"
ここでの問題は、上記の選択は、私は方法を見てきた宛先テーブル
に上記のデータを挿入するから私を防ぎ余分な列(ROWID)を生成することです上の選択のROWID列を取り除くか、元のテーブルのデータを元のテーブルから挿入します。 (元のテーブルのどこに存在するのか(選択クエリの残り))。 ...無駄にする
TLDR =計算で使用されるROWID列を取り除く
仕様同じ表に行を挿入することができ、その後に:
- 大量のデータ(数百万行)(そのためのビットでそれを処理する)
- 不明テーブル(私は上で呼び出すことはできません
- は同じデータが2回コピーされないように順序(したがってrow_number)を持つ必要があります。
- 挿入(最初に検索してローカルでいくつかのマジックを実行するとパフォーマンスに大きな影響を与えます)
- 必要に応じて追加の変数を追加することができます(オーダークラウス変数など)。クエリは常に変数になります+クエリにvarriablesを追加しない方が良い場合は、それが好ましいでしょう
誰かが私がさらに何を見ることができるかについてのアイデアを得ることを望みます。
大規模なデータセットでこれがどのように機能するかを知りたいと思います。あなたのコマンドを繰り返し実行するたびに、すべてのデータを%% physloc %%で抽出してソートする必要があり、行の適切なサブセットが得られるように思えます。また、このプロセスへの呼び出しの間に、レコードの%% physloc %%が変更される可能性があります。この場合、抽出されたセットに重複または欠落したレコードが存在する可能性があります。 – JohnRC
質問の2番目の部分は、同じ列名が取り込まれることによって処理されます。クエリの最後に、これらの列名を使用して任意のORDER BY句を作成します。 (すべての列名をORDER BY {columnname} ASCとしてループに入れ、後でそのデータをパージするときに再度使用してください) 私はあなたの懸念を%% physloc %%で共有しています。代わりに、 FETCH NEXTにORDER BYがあるので、テスト後に私の好みのアプローチになるかもしれません。 – Fondas
Hmmm ...ここでもリスクはあると思います。もしあなたが注文のためにどんな種類のシンボリックキーを使っても、レコードのグループを選択する順序を選択すると、抽出されたグループ間でレコードのキー値が変更されると、レコードのサブセットが選択されなくなる危険性があります。 – JohnRC