我发现,如果在同步过程中出现错误,我们的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'
答案 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