根据两列

时间:2015-11-24 16:50:25

标签: sql-server duplicates

我需要能够找到一些重复的行,这样我就可以在除了其中一个之外的所有行上更新已删除的标志。

假设该表名为tblMR,我需要找到共享LoadManifestIDVINid的重复项,然后我需要选择一个并进行更新。每个都有一个唯一的EntryLineNo列

我还没有尝试任何事情,因为我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

你真的需要发布更多细节,以便让人们更清楚,更轻松地帮助,但我认为这非常接近你所寻找的。

with FindDupes as
(
    select LoadManifestID
        , VINid
        , ROW_NUMBER() over(partition by LoadManifestID, VINid order by EntryLineNo) as RowNum
    from tblMR
)

update m
set IsDeleted = 1
from tblMR m
join FindDupes d on d.LoadManifestID = m.LoadManifestID 
                and d.VINid = m.VINid
where d.RowNum > 1

答案 1 :(得分:0)

你应该从哪里开始?

尝试查询所有EntryLine

SELECT * 
FROM EntryLine

如果可行,请继续查找所有EntryLine的重复项数量。

SELECT LeadManifestID, VINid, count(*)
FROM EntryLine

如果可行,请尝试为每组EntryLineNo找到确定性EntryLine

SELECT MIN(EntryLineNo), LeadManifestID, VINid, count(*)
FROM EntryLine

完成后,您需要查找所有重复的行,但不要共享预先选择的EntryLineNo

SELECT * 
FROM EntryLine e INNER JOIN (
    SELECT MIN(EntryLineNo) AS KeptNo, LeadManifestID, VINid, count(*)
    FROM EntryLine
) e2 ON e.VINid = e2.VINid AND e.LeadManifestID = e2.VINid AND e2.KeptNo != e.EntryLineNo

然后,您只需更新表

UPDATE
    e
SET
    toBeDelted = true
FROM
    SELECT * 
    FROM EntryLine e INNER JOIN (
        SELECT MIN(EntryLineNo) AS KeptNo, LeadManifestID, VINid, count(*)
        FROM EntryLine
    ) e2 ON e.VINid=e2.VINid AND e.LeadManifestID=e2.VINid AND e2.KeptNo!=e.EntryLineNo

这是一个非常浪费的方法,但它绝对是一个很好的开始方式。从那时起,您可以查看ROW_NUMBER,并简化过程。