【问题标题】:Self Join query to find duplicate records自联接查询以查找重复记录
【发布时间】:2015-07-01 17:52:16
【问题描述】:

我有一个大约有 32 列的表,我想检查重复的行,但有两列是唯一的,因此每行的列都不同。所以我需要JOIN 条件基本上是自加入重复记录,其中所有列都相等,除了两个。

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2


    【解决方案1】:

    要查找重复的行,查询将是(col1...col30 将排除每行始终唯一的两列)

    SELECT
      col1,
      col2,
      ...,
      col30
    FROM
      your_table
    GROUP BY
      col1,
      col2,
      ...,
      col30
    HAVING
      COUNT(*)>1
    

    EDIT:它出现在要删除重复行的备注中。假设您有每行唯一的列 id1 和 id2(即主键)以及可以重复的列 col1..col4。以如下脚本为例,删除重复行:

    CREATE TABLE #tt(
        id1 INT,
        id2 INT,
        col1 INT,
        col2 INT,
        col3 INT,
        col4 INT,
        PRIMARY KEY(id1,id2)
    );
    
    INSERT INTO #tt(id1,id2,col1,col2,col3,col4)
    VALUES (1,1,1,1,1,1),
           (1,2,1,1,1,1),
           (1,3,1,1,1,1),
           (2,1,1,1,1,1),
           (3,1,2,2,2,2),
           (4,1,2,2,2,2),
           (2,2,2,2,2,2),
           (3,3,3,3,3,3),
           (4,2,3,3,3,3);
    
    DELETE
        t
    FROM
        #tt AS t
        INNER JOIN (
            SELECT
                id1,
                id2,
                ROW_NUMBER() OVER (PARTITION BY col1,col2,col3,col4 ORDER BY id1,id2) AS rn
            FROM
                #tt
        ) AS trn ON
            trn.id1=t.id1 AND
            trn.id2=t.id2
    WHERE
        trn.rn>1;
    
    SELECT*FROM #tt;
    
    DROP TABLE #tt;
    

    【讨论】:

    • 嗨,正是这个查询给了我重复的内容让我进一步解释。
    • 我有一个带有架构的表 1
    • ID1 ID2 col1 col2 col3 col4
    • 其中 ID1 和 ID2 的值始终是唯一的,而其他值不断重复,所以只想让表中的所有值与 ID1 和 ID2 的对应记录匹配,并希望从表中删除重复项
    • @PoonamSinghania 我已经用删除重复行的脚本更新了我的答案。该脚本假定 id1,id2 是表上的主键。
    【解决方案2】:

    你也可以这样使用:

    SELECT *
    FROM yourTable t
    WHERE 1 < (
        SELECT COUNT(*) 
        FROM yourTable ti
        WHERE t.uniqueCol1 = ti.uniqueCol1 AND t.uniqueCol2 = ti.uniqueCol2
        GROUP BY nonUniqueCol1, nonUniqueCol2, ..., nonUniqueColn)
    

    或仅过滤重复的行而不显示您可以使用的原始行:

    SELECT *
    FROM (SELECT *,
              ROW_NUMBER() OVER (PARTITION BY nonUniqueCol1, nonUniqueCol2, ..., nonUniqueColn
                                 ORDER BY uniqueCol1, uniqueCol2) As seq
          FROM yourTable) t
    WHERE (seq > 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多