【问题标题】:Clarification on Identifying Duplicate Primary Keys关于识别重复主键的说明
【发布时间】:2014-05-15 21:23:00
【问题描述】:

由于一个错误,我现在有可能某些表的行在主键列中有重复数据。

假设我的表 T 包含主键列 A、B、C 和 D,以及非 PK 列 E、F 和 G。为了使行唯一,A B C 和 D 都必须具有唯一值。我可以有 A 相同的行,或者 A 和 B 具有相同的值,甚至 A B 和 C。但是如果我有两行 A B C 和 D 都具有相同的值,那将是一个问题。

这是否是找到此类事件的正确方法:

SELECT A, B, C, D, COUNT(*) AS 'Duplicates' FROM T
   GROUP BY A, B, C, D
   HAVING COUNT(*) > 1

感谢您的帮助。

【问题讨论】:

  • 你最初是如何得到重复主键的?不会约束抛出异常吗?也就是说 - 是的,上面的查询应该给你骗子。
  • 你的意思是复合键还是其他表的外键?其他明智的查询看起来不错。

标签: sql sql-server


【解决方案1】:

您没有使用声明性引用完整性吗?如果没有,为什么不呢?

你应该这样做:

with duplicate_row as
(
  select distinct
         x.A ,
         x.B ,
         x.C ,
         x.D ,
         x.E ,
         x.F ,
         x.G
  from ( select * ,
                seq = row_number() over (
                        partition by A,B,C,D
                        order by E,F,G
                        )
         from dbo.my_table
       ) x
  where x.seq > 1
)
delete dbo.my_table
from dbo.my_table  t
join duplicate_row d on d.A = t.A -- IMPORTANT:
                    and d.B = t.B -- you must join against ALL
                    and d.C = t.C -- columns, key and non-key
                    and d.D = t.D -- lest you blow away data
                    and d.E = t.E -- inadvertantly
                    and d.F = t.F
                    and d.G = t.G
GO

alter table dbo.my_table add constraint
  my_table_PK primary key clustered (A,B,C,D)
GO

【讨论】:

    【解决方案2】:

    以下查询将返回 colA、colB、colC 和 colD 重复的所有元组。我实际上在工作中使用此代码从表中删除重复的条目。 (将最后的选择切换为删除,删除所有重复项,同时在表中保留一个条目)

    with a as
       (SELECT 
             colA
             ,colB
             ,colC
             ,colD
          ,ROW_NUMBER() OVER(PARTITION by colA
                                                 ,colB
                                                 ,colC
                                                 ,colD
                                   ) as duplicateRecCount
        FROM Table)
    
     Select * from a 
     where duplicateRecCount > 1
    

    【讨论】:

    • 尝试改进你的答案。
    • @inf3rno - 请更具体地说,提供的代码应返回表中的所有数据,其中 4 字段主键已重复。我在工作中使用相同代码的修改版本从临时表中删除重复条目。我的代码还应该包括什么?
    • 更具体地说:根据编码标准格式化代码:stackoverflow.com/questions/522356/… 并写一些文字来描述它的作用或工作原理。 (有人将你的答案标记为低质量,如果你不改进它,我认为它会被删除。)
    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2019-05-14
    • 2019-08-29
    • 2019-05-06
    相关资源
    最近更新 更多