2012-03-21 145 views
1

我有一个SQL查询,我正在测试,并运行如下,但我注意到它似乎每次都返回不同的数据,然后我意识到它甚至返回一个当我检查它是否已经工作时不同数量的行!我已经多次运行了它,最终的select语句将返回25-32行之间的某个地方,但是这个变化怎么样?SQL更新,相同的查询,每次不同的结果

我正在使用begin tranrollback tran来处理相同的数据,并不认为这是问题所在。任何人都可以发现我做错了什么?

它在一个表(#AddressToDeleteMasterOfLesserId)上工作,它是Id的成对,并在客户地址上设置一个标志(IsPrimaryAddress)(如果它存在于表中并且它的对具有设置的标志)。 #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 delete配对和那些Ids to delete必须在CustomerAddressIsPrimaryAddress不同的匹配值。

在更新阶段,Id that is master行的IsPrimaryAddress随机更新为1或0,具体取决于匹配Id to delete行被选择为新值的来源。

+0

OF COURSE !!!!现在我再看一遍,这是非常有意义的。我会问另一个问题,我该如何解决这个问题,但是你知道是否有办法让备选案例“无所事事”,设置为自身不起作用,因为它会在第一次读取时出错,从而给出错误的答案 – 2012-03-21 20:46:56

0

的唯一途径,这将不会导致在每次运行相同的输出将是要么你正在做的这个以外其他东西,别人在做别的事情的这个之外,或有可能如果您有多个未完成的交易,这可能会变得不可靠。如果是后者,和/或测试它,只需运行ROLLBACK TRAN,直到出现错误,指出没有未完成的事务。如果你第一次得到错误,那么你没有任何开放。

+0

第一次得到错误,没有人触摸数据,因为它已经全部复制到一个单独的数据库,所以我可以玩它。现在运行至少20-30次,每次都不一样......将'go'语句放入以确保它不是一些奇怪的计时事件,仍然发生... – 2012-03-21 04:11:43

+0

那么你的#AddressToDeleteMasterOfLesserId表呢?在其中添加一个select * from #AddressToDeleteMasterOfLesserId,看看它是否正在改变。 – 2012-03-21 04:14:17

+0

感谢您的帮助,Andriy尽管如此。数据中有重复,当它们击中它们时,它将它们设置回来,现在看起来非常明显,但几乎将我驱动到昨天的窗台! – 2012-03-21 20:47:58

相关问题