0

問題に直面しており、これに対する解決策が見つかりません。フィールドからデータを取得するソース テーブル (T) があります。データには、タイムスタンプ付きの重複レコードが含まれる場合があります。私の目的は、フィールド データを取得し、同じ構造を持つ最終テーブル (F) に格納することです。挿入する前に、F にキー フィールドが存在するかどうかを確認します。存在する場合は、F のレコードを T の最新のレコードで更新します。それ以外の場合は、T から F にレコードを挿入します。重複がない限り、これは正常に機能します。 T のレコード。T にタイムスタンプが異なる同じキーの 2 つのレコードがある場合。常に両方のレコードを挿入します (キーが主キーの場合、挿入操作は失敗します)。操作に次のコードを使用しています-

         IF EXISTS(SELECT * FROM [Final_Table] F, TMP_Source T WHERE T.IKEy =F.IKEY)
                begin 
                    print 'Update'


                    UPDATE [Final_Table]
                    SET [FULLNAME] = T.FULLNAME
                    ,[FATHERNAME] = T.FATHERNAME
                    ,[MOTHERNAME] = T.MOTHERNAME
                    ,[SPOUSENAME] = T.SPOUSENAME

                    from TMP_Source T
                    WHERE Final_Table.IKEy = T.IKEy 
                        and [Final_Table].[RCRD_CRN_DATE] < T.RCRD_CRN_DATE
                    --Print 'Update'
                end
                               else
                begin

                    INSERT INTO [Final_Table]
                    ([IKEy],[FTIN],[FULLNAME],[FATHERNAME],[MOTHERNAME],[SPOUSENAME]
                    )
                    Select IKEy,FTIN,FULLNAME,FATHERNAME,MOTHERNAME,SPOUSENAME
                    from TMP_Source 

                end  

問題は、Tテーブルに次のようなエントリがある場合に発生します-

   IKey RCRD_CRN_DATE ...
   123 10-11-2013-12.20.30
   123 10-11-2013-12.20.35
   345 10-11-2013-01.10.10

3 つすべてが F テーブルに挿入されます。助けてください。

4

1 に答える 1

1

挿入を実行する前に使用して、最初のステップとして (まあ、CTEで)最新の行以外をすべて削除します。ROW_NUMBER()

;WITH UniqueRows AS (
    SELECT IKey,RCRD_CRN_DATE,FULL_NAME,FATHER_NAME,MOTHER_NAME,SPOUSENAME,FTIN,
        ROW_NUMBER() OVER (PARTITION BY IKey ORDER BY RCRD_CRN_DATE desc) as rn
    FROM TMP_Source
)
MERGE INTO Final_Table t
USING (SELECT * FROM UniqueRows WHERE rn = 1) s
ON t.IKey = s.IKey
WHEN MATCHED THEN UPDATE
      SET [FULLNAME] = s.FULLNAME
         ,[FATHERNAME] = s.FATHERNAME
         ,[MOTHERNAME] = s.MOTHERNAME
         ,[SPOUSENAME] = s.SPOUSENAME
WHEN NOT MATCHED THEN INSERT
    ([IKEy],[FTIN],[FULLNAME],[FATHERNAME],[MOTHERNAME],[SPOUSENAME]) VALUES
    (s.IKEy,s.FTIN,s.FULLNAME,s.FATHERNAME,s.MOTHERNAME,s.SPOUSENAME);

(すべての列が完全に正しいわけではないかもしれません。質問で切り替え続けているようです)

(お気づきかもしれませんが、MERGE手続き型コードを記述するのではなく、単一の宣言ステートメントとしてすべてを表現できるため、私も using に切り替えました)

于 2013-11-12T07:27:34.753 に答える