在SQL表中查找重复的值

使用一个字段很容易找到duplicates

SELECT name, COUNT(email) 
FROM users
GROUP BY email
HAVING COUNT(email) > 1

所以,如果我们有一张桌子

ID   NAME   EMAIL
1    John   asd@asd.com
2    Sam    asd@asd.com
3    Tom    asd@asd.com
4    Bob    bob@asd.com
5    Tom    asd@asd.com

这个查询将给我们约翰,萨姆,汤姆,汤姆,因为他们都有相同的email

但是,我想要的是使用相同的emailname获取重复email

也就是说,我想得到“汤姆”,“汤姆”。

我需要这个原因:我犯了一个错误,并允许插入重复的nameemail值。 现在我需要删除/更改重复项,所以我需要先找到它们。


SELECT
    name, email, COUNT(*)
FROM
    users
GROUP BY
    name, email
HAVING 
    COUNT(*) > 1

只需在两列上分组即可。

注意:ANSI标准将在GROUP BY中包含所有非聚合列。 MySQL允许你避免这种情况,但结果是不可预测的:

  • GROUP BY lname ORDER BY显示错误的结果
  • 在没有ANY()的情况下,哪个是最便宜的聚合函数(请参阅接受的答案中的注释)
  • 在MySQL中,你需要sql_mode=only_full_group_by


    尝试这个:

    declare @YourTable table (id int, name varchar(10), email varchar(50))
    
    INSERT @YourTable VALUES (1,'John','John-email')
    INSERT @YourTable VALUES (2,'John','John-email')
    INSERT @YourTable VALUES (3,'fred','John-email')
    INSERT @YourTable VALUES (4,'fred','fred-email')
    INSERT @YourTable VALUES (5,'sam','sam-email')
    INSERT @YourTable VALUES (6,'sam','sam-email')
    
    SELECT
        name,email, COUNT(*) AS CountOf
        FROM @YourTable
        GROUP BY name,email
        HAVING COUNT(*)>1
    

    OUTPUT:

    name       email       CountOf
    ---------- ----------- -----------
    John       John-email  2
    sam        sam-email   2
    
    (2 row(s) affected)
    

    如果你想使用这个dups的ID:

    SELECT
        y.id,y.name,y.email
        FROM @YourTable y
            INNER JOIN (SELECT
                            name,email, COUNT(*) AS CountOf
                            FROM @YourTable
                            GROUP BY name,email
                            HAVING COUNT(*)>1
                        ) dt ON y.name=dt.name AND y.email=dt.email
    

    OUTPUT:

    id          name       email
    ----------- ---------- ------------
    1           John       John-email
    2           John       John-email
    5           sam        sam-email
    6           sam        sam-email
    
    (4 row(s) affected)
    

    删除重复的尝试:

    DELETE d
        FROM @YourTable d
            INNER JOIN (SELECT
                            y.id,y.name,y.email,ROW_NUMBER() OVER(PARTITION BY y.name,y.email ORDER BY y.name,y.email,y.id) AS RowRank
                            FROM @YourTable y
                                INNER JOIN (SELECT
                                                name,email, COUNT(*) AS CountOf
                                                FROM @YourTable
                                                GROUP BY name,email
                                                HAVING COUNT(*)>1
                                            ) dt ON y.name=dt.name AND y.email=dt.email
                       ) dt2 ON d.id=dt2.id
            WHERE dt2.RowRank!=1
    SELECT * FROM @YourTable
    

    OUTPUT:

    id          name       email
    ----------- ---------- --------------
    1           John       John-email
    3           fred       John-email
    4           fred       fred-email
    5           sam        sam-email
    
    (4 row(s) affected)
    

    尝试这个:

    SELECT name, email
    FROM users
    GROUP BY name, email
    HAVING ( COUNT(*) > 1 )
    
    链接地址: http://www.djcxy.com/p/5163.html

    上一篇: Finding duplicate values in a SQL table

    下一篇: Table Naming Dilemma: Singular vs. Plural Names