• SQL Server 一列或多列重复数据的查询,删除


    业务需求

    最近给公司做一个小工具,把某个数据库(数据源)的数据导进另一个数据(目标数据库)。要求导入目标数据库的数据不能出现重复。但情况是数据源本身就有重复的数据。所以要先清除数据源数据。

    于是就把关于重复数据的查询和处理总结一下。这里只可虑基于数据库解决方案。不考虑程序的实现。

    环境为:SQL Server 2008

    基于数据库的解决方案

    数据库测试表dbo.Member

    一、单列重复

    一,带有having条件的分组查询方法

    (1)查询某一列重复记录

    语句:

      SELECT  Name FROM  dbo.Member t WHERE Name IN (SELECT Name FROM dbo.Member GROUP BY Name HAVING COUNT(Name)>1 ) ORDER BY t.Name

    查询结果:

    (2)查询某一列不重复的记录

    语句:

    SELECT * FROM dbo.Member WHERE ID  IN (SELECT MIN(ID) FROM dbo.Member GROUP BY Name)

    查询结果:

    (3)清除某一列重复的数据

    语句:

     DELETE FROM dbo.Member WHERE ID NOT IN (SELECT MIN(ID) FROM dbo.Member GROUP BY Name)

    执行结果:

    解释:上面的例子只保存了各自Name的最小值。

    二,DISTINCT 的用法
    温馨提醒:
    不支持多列统计
    Oracle和DB2数据库也适用

    利用distinct关键字返回唯一不同的值

    (1)查询某一列不重复数据

    语句:

      SELECT DISTINCT Name FROM dbo.Member

    结果集:

    (2)DISTINCT 查询多列不重复(如果查询的列有任何一个不重复,则这条记录视为不重复)

    语句:

    SELECT DISTINCT Name,Uid FROM dbo.Member
    查询结果


    DISTINCT 用于统计

    语句
     SELECT COUNT(DISTINCT(Name)) FROM dbo.Member

     二、多列重复

    数据表结构

    查找Original_ID和Match_ID这两列值重复的行

    SQL语句

    复制代码
    SELECT m.* FROM dbo.Match m,(
    SELECT Original_ID,Match_ID
    FROM dbo.Match 
    GROUP BY Original_ID,Match_ID
    HAVING COUNT(1)>1
    
    ) AS m1
    WHERE m.Original_ID=m1.Original_ID AND m.Match_ID=m1.Match_ID
    复制代码

    查询结果

    复制代码
    复制代码
  • 相关阅读:
    推荐一篇好文加上一些补充
    我也来写一个俄罗斯方块
    使用canvas绘制一个时钟
    断句:Store all parameters but the first passed to this function as an array
    Observer Pattern
    web worker 的 self
    练练断句
    as 什么意思?
    natively 在本地机器
    in mind (不是 切记 的意思)
  • 原文地址:https://www.cnblogs.com/shiyh/p/8404246.html
Copyright © 2020-2023  润新知