2012-03-21 24 views
1

私はテストしているSQLクエリを以下のように実行していますが、毎回異なるデータを返すように見えて、私はそれが働いているかどうかをチェックするときに行の異なる量!私はそれを複数回実行し、最終的なselect文は25-32行の間のどこかに戻りますが、どのように変更できますか?SQLアップデート、同じクエリ、毎回異なる結果

同じデータを扱うのにbegin tranrollback tranを使用していますが、これは問題ではないと思います。誰でも私が間違っていることを見つけることができますか?

Idのペアであり、テーブルに存在し、そのペアにフラグが設定されている場合、顧客アドレスにフラグ(IsPrimaryAddress)を設定するテーブル(#AddressToDeleteMasterOfLesserId)で動作します。 #AddressToDeleteMasterOfLesserIdは既に定義されており、変更されません。これは、各実行で同じ出力にはなりませんことを唯一の方法は、あなたがこのの外で何かをやっているのいずれか、他の誰かが、この外の何かをやっているということでしょう

begin tran t1 

    select CustomerAddress.IsPrimaryAddress, p1.[Id that is master],p1.[Id to delete], c2.IsPrimaryAddress 
    FROM CustomerAddress 
    join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master] 
    join CustomerAddress c2 on p1.[Id to delete]=c2.Id 
    order by [Id that is master] 

    --Update primary address 
    UPDATE CustomerAddress 
    SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END 
    FROM CustomerAddress 
    join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master] 
    join CustomerAddress c2 on p1.[Id to delete]=c2.Id 

    select CustomerAddress.IsPrimaryAddress, p1.[Id that is master],p1.[Id to delete], c2.IsPrimaryAddress 
    FROM CustomerAddress 
    join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master] 
    join CustomerAddress c2 on p1.[Id to delete]=c2.Id 
    where CustomerAddress.IsPrimaryAddress=0 
    and c2.IsPrimaryAddress=1 
    order by [Id that is master] 

    rollback tran t1 

答えて

1

あなた#AddressToDeleteMasterOfLesserIdテーブルは同じId that is masterが複数のId to deleteCustomerAddressテーブルにおけるIsPrimaryAddressの異なるマッチング値を有するIds to deleteそれらと対にされたいくつかのペアを保持しなければなりません。

Id that is master行のIsPrimaryAddressは、新しい値のソースとして一致するId to deleteが選択されたことに応じて、ランダムに1または0のいずれかで更新されます。

+0

OF COURSE !!!!これは私がもう一度それを見ると完全に意味をなさない。私はこれを回避する方法について別の質問をしますが、代替案を「何もしない」方法があるかどうか知っていますか? –

0

、または可能性があります複数の取引を開いている場合、これは不安定になる可能性があります。それが後者であり、かつ/またはそれをテストする場合は、開いているトランザクションがないことを示すエラーが出るまで、ROLLBACK TRANを実行してください。初めてエラーが発生した場合は、開かれていませんでした。

+0

初めてエラーが発生しました。他の誰もデータに触れていないため、別のデータベースにコピーされているため、再生できませんでした。少なくとも毎回20〜30回は実行しました。毎回違う...実行するには、まだ奇妙なタイミングのことではないことを確認するために「go」ステートメントを入れてください。 –

+0

#AddressToDeleteMasterOfLesserIdテーブルはどうですか? #AddressToDeleteMasterOfLesserIdからselect *を追加して、それが変化しているかどうかを確認してください。 –

+0

あなたの助けてくれてありがとう、アンドリーはマークを打つ。データに重複があり、それがヒットしたら、それを元に戻していたので、今明らかになったようですが、昨日私を棚に近づけました!! –

関連する問題