zoukankan      html  css  js  c++  java
  • SQL查询和删除重复字段的内容

    --例如: 
    id           NAME         VALUE 
    1               a                 pp 
    2               a                 pp 
    3               b                 iii 
    4               b                 pp 
    5               b                 pp 
    6               c                 pp 
    7               c                 pp 
    8               c                 iii 
    --id是主键 
    --要求得到这样的结果 
    id           NAME         VALUE 
    1               a                 pp 
    3               b                 iii 
    4               b                 pp 
    6               c                 pp 
    8               c                 iii
    
    --方法1
    DELETE YourTable
    WHERE  [id] NOT   IN (SELECT MAX([id])
                          FROM   YourTable
                          GROUP BY
                                 (NAME + VALUE)) 
           
    --方法2
    
    DELETE a
    FROM   表 a
           LEFT   JOIN (
                    SELECT id = MIN(id)
                    FROM   表
                    GROUP BY
                           NAME,
                           VALUE
                )b
                ON  a.id = b.id
    WHERE  b.id IS NULL 
           
           
           
    --查询及删除重复记录的SQL语句
    --查询及删除重复记录的SQL语句
    --1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
    
    SELECT *
    FROM   people
    WHERE  peopleId IN (SELECT peopleId
                        FROM   people
                        GROUP BY
                               peopleId
                        HAVING COUNT(peopleId) > 1)
    --2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
    
    DELETE 
    FROM   people
    WHERE  peopleId IN (SELECT peopleId
                        FROM   people
                        GROUP BY
                               peopleId
                        HAVING COUNT(peopleId) > 1)
           AND rowid NOT IN (SELECT MIN(rowid)
                             FROM   people
                             GROUP BY
                                    peopleId
                             HAVING COUNT(peopleId) > 1)
    --3、查找表中多余的重复记录(多个字段)
    
    SELECT *
    FROM   vitae a
    WHERE  (a.peopleId, a.seq) IN (SELECT peopleId,
                                          seq
                                   FROM   vitae
                                   GROUP BY
                                          peopleId,
                                          seq
                                   HAVING COUNT(*) > 1)
    --4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
    
    DELETE 
    FROM   vitae a
    WHERE  (a.peopleId, a.seq) IN (SELECT peopleId,
                                          seq
                                   FROM   vitae
                                   GROUP BY
                                          peopleId,
                                          seq
                                   HAVING COUNT(*) > 1)
           AND rowid NOT IN (SELECT MIN(rowid)
                             FROM   vitae
                             GROUP BY
                                    peopleId,
                                    seq
                             HAVING COUNT(*) > 1)
               
    --5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
    
    SELECT *
    FROM   vitae a
    WHERE  (a.peopleId, a.seq) IN (SELECT peopleId,
                                          seq
                                   FROM   vitae
                                   GROUP BY
                                          peopleId,
                                          seq
                                   HAVING COUNT(*) > 1)
           AND rowid NOT IN (SELECT MIN(rowid)
                             FROM   vitae
                             GROUP BY
                                    peopleId,
                                    seq
                             HAVING COUNT(*) > 1)
    --(二)
    --比方说
    --在A表中存在一个字段“name”,
    --而且不同记录之间的“name”值有可能会相同,
    --现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
    
    SELECT NAME,
           COUNT(*)
    FROM   A
    GROUP BY
           NAME
    HAVING COUNT(*) > 1
    
    --如果还查性别也相同大则如下:
    
    SELECT NAME,
           sex,
           COUNT(*)
    FROM   A
    GROUP BY
           NAME,
           sex
    HAVING COUNT(*) > 1(三)
    --方法一
    
    DECLARE @max     integer,
            @id      integer
    
    DECLARE cur_rows CURSOR LOCAL 
    FOR
        SELECT 主字段,
               COUNT(*)
        FROM   表名
        GROUP BY
               主字段
        HAVING COUNT(*) > ; 1
    
    OPEN cur_rows
    FETCH cur_rows INTO @id,@max
    WHILE @@fetch_status = 0
    BEGIN
        SELECT @max = @max -1
        SET ROWCOUNT @max
        DELETE 
        FROM   表名
        WHERE  主字段 = @id
        
        FETCH cur_rows INTO @id,@max
    END
    CLOSE cur_rows
    SET ROWCOUNT 0
        
    --方法二
    --"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
    --1、对于第一种重复,比较容易解决,使用
    
    SELECT DISTINCT * 
    FROM   tableName
    --就可以得到无重复记录的结果集。
    --如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
    
    SELECT DISTINCT * INTO #Tmp
    FROM   tableName
    
    DROP TABLE tableName
    SELECT * INTO tableName
    FROM   #Tmp
    
    DROP TABLE #Tmp
    --发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
    --2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
    --假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
    SELECT IDENTITY(INT, 1, 1)  AS autoID,
           * INTO #Tmp
    FROM                           tableName
    
    SELECT MIN(autoID) AS autoID INTO #Tmp2
    FROM   #Tmp
    GROUP BY
           NAME,
           autoID
    
    SELECT *
    FROM   #Tmp
    WHERE  autoID IN (SELECT autoID
                      FROM   #tmp2)
    --最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)(四)
    --查询重复
    
    SELECT *
    FROM   tablename
    WHERE  id IN (SELECT id
                  FROM   tablename
                  GROUP BY
                         id
                  HAVING COUNT(id) > 1)

  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/smartsmile/p/6234264.html
Copyright © 2011-2022 走看看