2015-06-18 242 views
2

因此,我需要重複檢查一個複雜的對象,然後從所有關聯的表級聯刪除愚蠢,我想知道如果我可以在SQL Server中有效地做到這一點,或如果我應該在我的代碼中進行處理。在結構上,我有以下表格。檢查(和刪除)SQL Server中的複雜對象重複

  • 權利要求
  • ClaimCaseSubTypes(映射表多對多的關係)
  • ClaimDiagnosticCodes(同上)
  • ClaimTreatmentCodes(同上)

基本上是一個如權利要求是,只有當它是一個重複的匹配8個字段本身,並在所有映射表中具有相同的關係。

對於實施例,下面的記錄將被指示爲重複

Claim 
Id  CreateDate Other Fields 
1  1/1/2015  matched 
2  6/1/2015  matched 

ClaimCaseSubTypes 
ClaimId SubTypeId 
1   34 
1   64 
2   34 
2   64 

ClaimDiagnosticCodes 
ClaimId DiagnosticCodeId 
1   1 
2   1 


ClaimTreatmentCodes 
ClaimId TreatmentCodeId 
1   5 
1   6 
2   6 
2   5 

在這種情況下我想保持1並從權利要求表以及與ClaimID的映射表的任何行刪除2 2

+1

你有一個有趣的問題,但沒有問題。你想做什麼?獲取所有重複?獲取單個案例的重複內容?從數據庫中刪除重複的案例?只要有一個查詢返回非重複的情況? –

+0

謝謝你的評論戈登。我編輯了這個問題。我想刪除重複項,只留下最早創建的記錄 –

回答

3

這是什麼樣的問題,即窗函數是:

;WITH cte AS (
    SELECT  c.ID, 
       ROW_NUMBER() OVER (PARTITION BY field1, field2, field3, ... ORDER BY c.CreateDate) As ClaimOrder 
    FROM  Claim  c 
    INNER JOIN other tables... 
) 

UPDATE Claim 
    SET   IsDuplicate = IIF(cte.ClaimOrder = 1, 0, 1) 
    FROM  Claim c 
    INNER JOIN cte ON c.ID = cte.ID 

的字段您在PARTITION BY包括表明兩個要求被認爲匹配的字段需要相同。 ORDER BY告訴SQL Server最早聲明的順序是1.所有沒有順序爲1的是其他的副本。

+0

我不知道你可以在多個表上使用PARTITION BY。這是一個乾淨而簡單的解決方案,我很抱歉,我沒有想到它。謝謝! –