2017-12-05 8 views
0

私は連絡先テーブルに重複データを持っています。 Rank()関数の使用私は重複を識別しています。 子テーブルのアクティビティの連絡先のIDも更新する必要があります。親テーブルに重複がある子テーブルを更新

アクティビティテーブルの連絡先IDを、ランク1以上のランク1の連絡先IDで更新したいとします。重複する連絡先

(SELECT 
    ExternalContactID, 
    RANK() OVER (PARTITION BY ExternalAccountId, Name, Email, MailingCity, 
    MailingCountry, MailingState, MailingStreet, Phone ORDER BY 
    ExternalContactID) AS rank 

FROM 
    contact) 

表を見つけるために、このクエリを使用して


ExternalContactID | Rank 
    101   | 1 
    102   | 2 

子テーブルにお問い合わせください:活動

ActivityID | ContactID 
    1   |  101 
    2   |  102 

ランク> 1の連絡先を削除する前に、子テーブル「アクティビティ」をランク1の連絡先IDで更新する必要があります。

結果:102が削除され、ID = 2との活動の記録は今、あなたは、重複のグループと各グループの1を識別するために、RANKを使用しました連絡先ID = 101

+0

こんにちは、ようこそ。あなたはビジネス上の必要性を定義しましたが、助けが必要なことは言いませんでした。テーブル定義といくつかのサンプルデータを投稿することができれば、大きな助けになるでしょう。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

ExternalContactID |ランク 101 | 1 102 | 2 – user3861542

+0

それは役に立ちません、あなたはその質問に投稿しました。それでも意味をなさない。私があなたに送ったリンクを見てください。 –

答えて

0

を持っている= idの

問い合わせあなたは守りたい。これは、すべての行を「キーパー」(保持したい複製グループのメンバー)に関連付ける自己結合を行うためのメカニズムです。上記の擬似コードで

WITH cte AS (
    {Query with Rank column} 
) 
    SELECT ... 
    FROM cte a 
    INNER JOIN cte b 
    ON {all the partitioning columns being equal} 
    AND a.Rank=1 
    AND b.Rank<>1 

、あなたはテーブルのすべての行は、あなたが重複を削除した後、「キーパー」になるだろう行に接合するんです。あなたのUPDATEのこの構造体にJOINして、FKをそれに関連する「Keeper」のPKに設定します。

関連する問題