2015-11-24 4 views
-1

Мне нужно найти несколько повторяющихся строк, чтобы я мог обновить удаленный флаг на всех, кроме одного из них.Найти дубликаты на основе двух столбцов

Say таблица называется tblMR, мне нужно найти дубликаты, которые разделяют LoadManifestID и VINid, то мне нужно, чтобы иметь возможность выбрать один и сделать обновление. У каждого есть уникальный столбец EntryLineNo

Я еще ничего не пробовал, так как я понятия не имею, с чего начать.

+1

пожалуйста, прочтите [** Как задать **] (http://stackoverflow.com/help/how-to-ask) \t \t \t И [** Как создать минимальный, полный и проверяемый пример . **] (http://stackoverflow.com/help/mcve) это отличное место для начала \t http://spaghettidba.com/2015/04/24/how-to-post-at-sql -question-on-a-public-forum/ –

+0

Как насчет того, чтобы начать поиск «дубликатов»? Если все они имеют уникальный EntryLineNo, который вы хотите обновить? –

ответ

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 
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 и упростить процесс.

Смежные вопросы