在SQL Server

时间:2015-06-18 14:21:39

标签: sql sql-server

所以我需要复制检查一个复杂的对象,然后从所有关联的表级联删除dupes,我想知道我是否可以在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并从Claim表中删除2以及ClaimId为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的所有内容都与其他内容重复。