なんだか斜め上に不思議シリーズ
あるテーブルがいるとする
HogeT (A bigint,B varchar(20),C Money,D bigint INDENTITY(0,1) )
HogeM ( B varchar(20),E char(1))
このとき、HogeMにおいてEが1のBと同じBを持つHogeTでCの金額があるAに対してDの昇順で連番を振りたい、とする
UPDATE T
SET T.A = S.ID
from HogeT T ,
( select row_number() over (order by D) as ID , D
from HogeT INNER JOIN HogeM ON HogeM.B = HogeT.B AND HogeM.E = '1'
Where HogeT.C > 0 ) S
WHERE T.D = S.D
UPDATE T
SET T.A = S.ID
from HogeT T ,
( select row_number() over (order by D) as ID , D
from HogeT
WHERE B in (SELECT B from HogeM Where HogeM.E = '1') and C > 0 ) S
WHERE T.D = S.D
この二つのSQL、やりたい事が同じはずなんだけど、結果が違う。それもSQL-CLRからADO.netのExecuteNonQueryで処理した場合で、データ件数が増えてだいたい5千件越えた辺りから、起き始める。Where句だけで処理する方は安定してるんだけど、InnerJoin だと漏れてしまうレコードが数件。漏れるレコードは毎回同じなので、何かが違うんだと思う。
自分でT-SQLで手動で動かしてると一致してたんだけどなぁ……うーん不思議。