2

SQL Server Management Studio 2012 を使用しています。数千行のデータを含むテーブルがあります。行の多くは重複しているため、削除する必要があります。各行には[OwnerID]、Identity Increment が 1 の Identity Specification に設定された一意の識別子が[FirstName]あり[LastName]ます[CompanyName]

したがって、これら 3 つの列の値の組み合わせが重複している行を削除する必要があります。削除後、ID 仕様をリセットし [OwnerID]て最初の行を 1 から開始し、残りの行に 1 ずつ値を割り当てるように書き込むことができる t-sql はありますか?

ご協力ありがとうございます。

4

3 に答える 3

1

row_number()最初の行を保持するために使用して、行を削除する 1 つの方法を次に示します。

with todelete as (
    select t.*,
           row_number() over (partition by firstname, lastname, companyname
                              order by ownerid) as seqnum
    from t
)
delete from todelete
    where seqnum = 1;

ownerid をリセットするには、同様のアイデアを使用することもできます。

with toupdate as (
    select t.*, row_number() over (order by ownerid) as seqnum
    from t
   )
update toupdate
    set ownerid = seqnum;

ただし、これには細心の注意を払う必要があります。適切に設計されたデータベースでは、 と呼ばれるフィールドは、またはOwnerIDと呼ばれるテーブルの列を参照します。ID の値を変更すると、他のテーブルに影響を与える可能性があります。Owner.OwnerIdOwner.Id

于 2013-01-21T03:37:32.380 に答える
0

一時テーブルSQL Fiddleを使用した私の試みは次のとおりです。

SELECT 
firstName, LastName, CompanyName, COUNT(*) thecount, MIN(ID) min_id
INTO #temp
FROM tab
GROUP BY firstName, LastName, CompanyName;

SELECT 
a.id ID, b.min_id
INTO #temp1
FROM tab a, #temp b
WHERE  a.firstName  = b.FirstName 
AND a.LastName    = b.LastName
AND a.CompanyName = b.CompanyName
AND b.thecount > 1;

-- run this query on all referenced tables:
UPDATE tab2 SET tab2.ID = t.min_id
FROM tab2, #temp1 t
WHERE tab2.ID = t.ID;

DELETE t
FROM tab t, #temp1 a
WHERE t.id = a.id and a.id <> a.min_id;
于 2013-01-21T03:51:52.617 に答える
0

重複データを削除して 1 つの値を保持する場合は、複数の列に対してこのクエリをコンマで区切って使用します

a from ( select *, rn=row_number() over (Partition by FirstName order by MemberId) from Membership ) a where rn > 1; から a を削除します。

于 2013-08-01T12:17:52.093 に答える