2016-05-18 1 views
-2

次のクエリを使用しています。 しかし、それはトップ1000の行を転送するだけです。私はもっ​​と多くの行を持っています。 where not exists句を削除すると、完全なデータが取得されます。どこが間違っているのか教えていただけますか?トップ100行のみを挿入するクエリ

DECLARE @BatchSize INT = 1000 
DECLARE @Counter INT = 0 
DECLARE @TableCount INT = 0 
set @TableCount = (select count(*) from Table2) 

while @Counter < (@TableCount/@BatchSize+1) 
BEGIN 

    INSERT INTO Table1 
    SELECT * FROM Table2 MH 
    inner join Table3 M 
    on MH.Mid = M.Mid 
    WHERE NOT EXISTS ( 
     SELECT * FROM Table1 
     where MH.otherid = M.otherid 
    ) 
    order by id OFFSET (@BatchSize * @Counter)ROWS FETCH NEXT @Batchsize ROWS ONLY; 
    SET @[email protected]+1 

END 

1000行を挿入するのはなぜですか?

+0

*なぜこのようにクエリを実行していますか?一度に完全なクエリを発行するだけではいかがですか? –

+0

簡単な間違い( 'WHERE NOT EXISTS'句の元の形式)のために、なぜ「トップ1000行を挿入するのはなぜですか?」という質問はもはや有効ではないので、この質問を閉じるために投票します。 –

+0

私は何百万というデータを持っており、テーブル全体をロックしたくないです。 –

答えて

0
WHERE NOT EXISTS ( 
    SELECT 1 FROM Table1 
) 

は、挿入の最初のバッチでのみ真と評価されます。その後、ターゲット表にレコードがあり、WHERE句はFALSEと評価され、それ以上の挿入は行われません。

+0

私はクエリを更新しました。 –

+0

あなたが行くにつれて質問を変更しないでください。以前の回答が無効になります。 –

+0

私はすべての行を取得していないという疑問がまだ残っています。 –

0

Table2にはいくつの行がありますか? 2番目のループは、テーブルカウントが1001行を超えている場合は、最初のループの後に飛び出して、(1 < (TableCount/1001)のWHILE条件を生成します。

+0

ああ、これは問題かもしれませんが、私は@Eric J.の答えも好きです。いい視点ね! –

+0

私はクエリを更新しました。今、私はちょうど交互に1000行を取得します。 –

+1

移動先の質問を投稿しないでください。あなたが何を求めているかを十分に突き止めて実験したことがない場合は、最初にそれを行い、質問を投稿して答えを待ってください。この時点で、他に試してみたいことがある場合は、それを行い、新しい*質問を投稿して投稿してください。現在の回答が無効になるように質問を編集しないでください。あなたが元々持っていた質問に答えました。それがそれであるはずです。これが同様の質問がたくさんあるのでSOが汚染されていると感じたら、それはあなたが十分な質問に取り組んでいないことを意味します。まずそれをしてください。 –

0
DECLARE @BatchSize INT = 1000 
DECLARE @Counter INT = 0 
--DECLARE @TableCount INT = 0 
--set @TableCount = (select count(*) from Table2) 
declare @rows int = 1 
while @rows>[email protected] < (@TableCount/@BatchSize+1) 
BEGIN 

    INSERT INTO Table1 
    SELECT * FROM Table2 MH 
    inner join Table3 M 
    on MH.Mid = M.Mid 
    --if you want non-existing 
    left join table1 t on t.field = M.field 
    where t.field is null 
    -- end if you want 
    --WHERE NOT EXISTS ( --not exists WHAT? 
    -- SELECT 1 FROM Table1 
    --) 
    order by id OFFSET (@BatchSize * @Counter) ROWS FETCH NEXT @Batchsize ROWS ONLY; 
    --SET @[email protected]+1 
    select @rows = @@rowcount, @counter = @counter + 1 
END 
関連する問題