0

我面临一个问题,找不到任何解决方案。我有一个源表(T),我从字段中获取数据。数据可能包含带有时间戳的重复记录。我的目标是获取字段数据并将其存储到具有相同结构的最终表 (F) 中。在插入之前,我检查 F 中是否存在关键字段,如果是,我用 T 中的最新记录更新 F 中的记录。否则,我从 T 中插入 F 中的记录。只要没有重复,这工作正常记录在 T 中。如果 T 有两个具有不同时间戳的相同密钥的记录。它总是插入两条记录(如果键是主键,则插入操作失败)。我正在使用以下代码进行操作 -

         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

这三个都插入到 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);

(我可能没有完全正确的所有列,它们似乎在你的问题中不断切换)

(您可能已经注意到,我也改用了 using,MERGE因为它允许我们将所有内容表达为单个声明性语句,而不是编写程序代码)

于 2013-11-12T07:27:34.753 回答