更新重复记录以便过滤它们

时间:2016-09-13 15:55:52

标签: sql-server

我发现,如果在同步过程中出现错误,我们的ERP集成工具网站将重复插入。在错误解决之前,每次同步重试时记录都会重复,通常每5分钟重复一次。

尝试找到更新重复记录的有效方法,以便在查询视图时筛选重复项。我遇到的挑战是副本会有一些不同的列。

例如,查看SalaesOrderDetail表,订单有120个订单项。但是,由于同步问题,每行都是重复的。

我已尝试使用以下内容测试过去一个月:

WITH cte AS (
SELECT  SOHD.[salesorderno], [itemcode],[CommentText], unitofmeasure, itemcodedesc, quantityorderedoriginal, quantityshipped,
 row_number() OVER(PARTITION BY SOHD.[salesorderno], [itemcode], unitofmeasure, itemcodedesc, quantityorderedoriginal, quantityshipped ORDER BY SOHD.[Linekey] desc) AS [rn]
FROM [dbo].[SO_SalesOrderHistoryDetail] SOHD
inner join [dbo].[SO_SalesOrderHistoryHeader] SOHH on SOHH.Salesorderno = SOHD.Salesorderno
Where year(orderdate) = '2016'
and month(orderdate) = '08'
--Only Look at completed orders, ignore quotes & deleted orders
and SOHH.Orderstatus in ('C')
--Only looks for item lines where something did not ship (prevent removing a "good" entry)
and [quantityshipped] = '0'
)
Select *
from cte

但是,我一直在发现使用它的问题,因为如果我用这个运行更新命令,它将更新它不应该的一些记录。如果我为它添加一些列更具体,它就不会编辑它需要的一些列。

例如,如果我不添加

where rn >1 then I inadvertently edit records that are not duplicates

但如果我添加

where rn >1 then the 1st set of duplicate records won't be updated.

感觉卡住,但不知道该怎么做。

从评论部分添加更多信息。我想也许我的cte语句找到重复项和更新命令可能必须有所不同。示例数据:

Order#   Itemcode   CommentText   UnitofMeasure   itemcodedesc   qtyordered   qtyshipped
12345     abc        null           each           candy            5            0
12345     abc        null           each           candy            5            5
12345     xyz        null           case           slinky           25            0
12345     xyz        null           case           slinky           25            25

因此,如果我包含qtyshipped列,它们不是重复的,但我想要做的只是更新qtyshipped = 0的记录。我计划的更新是设置commenttext =' delete'

1 个答案:

答案 0 :(得分:1)

ROW_NUMBER更改为COUNT() Over()窗口函数

WITH cte 
     AS (SELECT SOHD.[salesorderno], 
                [itemcode], 
                [commenttext], 
                unitofmeasure, 
                itemcodedesc, 
                quantityorderedoriginal, 
                quantityshipped, 
                Count(1) 
                  OVER(partition BY SOHD.[salesorderno], [itemcode], unitofmeasure,itemcodedesc) AS [rn] 
         FROM   [dbo].[so_salesorderhistorydetail] SOHD
         ..........) 
SELECT * 
FROM   cte 
WHERE  rn > 1