2015-11-24 107 views
-1

我需要能夠找到一些重複的行,以便我可以更新除了其中一個以外的所有已刪除的標誌。根據兩列查找重複項

假設表格被稱爲tblMR,我需要找到共享LoadManifestIDVINid的副本,然後我需要能夠選擇一個並進行更新。每個人都有一個獨特的列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 

如果這樣的作品,儘量爲每個組的EntryLine尋找確定性EntryLineNo

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,並且簡化了這個過程。