zoukankan      html  css  js  c++  java
  • 如何去重一个SQL Server表

    前面我写了个博客记录如何去重一个oracle表(link), 主要是利用了oracle的rowid伪列和row_number()分析函数. 有读者写邮件问, 如何去重一个SQL Server表, 场景和前面文章一样, 即: 有部分字段有重复值, 表结构中没有一个能唯一定位的ID列, 也不允许修改表结构. 下面我给了个基本的思路.


    --步骤0, 根据原表table_a, 创建一个临时表table_a_temp, 仅仅增加了一个自增列row_id, 原因是SQL Server没有类似Oracle的rowid伪列, 我们就自己造一个. 
    --假设原表的结果为: create table table_a (pk int, other_field char(10));
    create table table_a_temp (pk int, other_field char(10), row_id int IDENTITY(1,1) NOT NULL);

    --步骤1, 将重复PK的记录加载到临时表table_a_temp
    truncate table table_a_temp ;
    insert into table_a_temp(pk, other_field) select pk, other_field from table_a a group by pk, other_field having count(*)>1 ;

    --步骤2, 删除所有重复PK的记录, 这不是去重
    --SQL Server 关联delete的写法有点诡异 delete table_a from table_a
    delete table_a  from table_a  b  inner join
    (
    select pk,other_field from table_a a group by pk, other_field having count(*)>1
    ) c
    on b.pk=c.pk and b.other_field=c.other_field ;

    --步骤3, 重表table_a_temp. 因为table_a_temp表有一个自增字段row_id, 这时候, 我们就可以利用row_id来去重
    --代码略, 可参考oracle版本的代码(link)

    --步骤4, 将去重后的table_a_temp记录补会到原表table_a, 这样table_a就没有重复的pk
    insert into table_a (pk, other_field) select pk, other_field from table_a_temp ;

  • 相关阅读:
    make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
    Eclipse开发C/C++ 安装配置
    没有文件扩展“.js”的脚本引擎问题解决
    Linux目录架构详解
    Linux查看硬件信息以及驱动设备的命令
    23种设计模式彩图
    ACE在Linux下编译安装
    void及void指针含义的深刻解析
    centos7.x设置nginx开机自启动
    Centos7防火墙关闭和启用iptables操作
  • 原文地址:https://www.cnblogs.com/harrychinese/p/eliminate_duplicate_records_in_sql_table.html
Copyright © 2011-2022 走看看