Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于两列查找重复项_Sql Server_Duplicates - Fatal编程技术网

Sql server 基于两列查找重复项

Sql server 基于两列查找重复项,sql-server,duplicates,Sql Server,Duplicates,我需要能够找到一些重复的行,这样我就可以更新除其中一行之外的所有行上的已删除标志 假设该表名为tblMR,我需要找到共享LoadManifestID和VINid的重复项,然后我需要能够选择一个并进行更新。每个都有一个独特的EntryLineNo列 我还没有尝试过任何东西,因为我不知道从哪里开始。你真的需要发布更多的细节,让帮助的人更清楚、更容易,但我认为这与你想要的非常接近 with FindDupes as ( select LoadManifestID , VINid

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

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


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

你真的需要发布更多的细节,让帮助的人更清楚、更容易,但我认为这与你想要的非常接近

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

你应该从哪里开始

尝试查询所有
EntryLine

SELECT * 
FROM EntryLine
SELECT LeadManifestID, VINid, count(*)
FROM EntryLine
SELECT MIN(EntryLineNo), LeadManifestID, VINid, count(*)
FROM EntryLine
如果有效,则继续查找所有
EntryLine
的重复数

SELECT * 
FROM EntryLine
SELECT LeadManifestID, VINid, count(*)
FROM EntryLine
SELECT MIN(EntryLineNo), LeadManifestID, VINid, count(*)
FROM EntryLine
如果可行,请尝试为每组
EntryLine
查找确定性
EntryLine

SELECT * 
FROM EntryLine
SELECT LeadManifestID, VINid, count(*)
FROM 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

虽然这是一个相当浪费的方法,但它绝对是一个好的开始。从那时起,您可以查看
行号
,从而简化流程。

请阅读,这是一个很好的起点,从查找“重复项”开始如何?如果他们都有一个唯一的EntryLineNo,您希望更新哪一个?