0

誤って更新されたSQLServerテーブルの1つのデータを更新する必要があります。これにより、ある行のセルのデータが次の行を上書きしていました。以下は、テーブルが正しい状態になっているはずの例です。

FirstName      LastName     EmailID
--------------------------------------------------
abc            xyz          abc.xyz@something.com
def            321          def.321@something.com
ghi            123          ghi.123@something.com

誤ってデータは次のようになりました。

FirstName   LastName    EmailID
---------------------------------------------
abc         xyz         something
def         321         abc.xyz@something.com
ghi         123         def.321@something.com

最後の1つのレコードが見つからないことはわかっていますが、少なくとも他のレコードは正しく復元する必要があります

4

1 に答える 1

1

テーブルがfirstName、lastNameの順に並べられているとすると、次のように使用できます。

declare @contact as table (firstName varchar(255), lastName varchar(255), emailID varchar(255))
insert into @contact (firstName, lastName, emailID)
values
    ('abc', 'xyz', 'something')
    ,('def', '321', 'abc.xyz@something.com')
    ,('ghi', '123', 'def.321@something.com');


with contactCTE(rowNo, firstName, lastName, emailID) 
as
(
    select 
        ROW_NUMBER() OVER (ORDER BY firstName, lastName DESC)
        ,firstName 
        ,lastName 
        ,emailID 
    from
        @contact 
)
update c1   
set
    emailID = c2.emailID 
from 
    contactCTE c1
    inner join contactCTE c2 on c1.rowNo +1 = c2.rowNo;

select * from  @contact     

データの順序が異なる場合は、これを反映するようにORDER BYパーツを変更するだけです。contactCTE

于 2012-09-28T11:27:07.160 に答える