需要删除所有重复记录...(如果一行有重复,则需要删除这两行)

时间:2014-11-06 11:08:12

标签: sql sql-server sql-server-2005

我有两张表 table1 table2

它们都是相同的,只是table2没有主键或约束。

我需要将数据从table2复制到table1

table1 接受重复的行。

table1中的主键基于5列:col1col2col3col4col5

table2有一堆重复的行。

我可以使用以下内容获取table2中的重复行:

SELECT count(*) as 'Occurence' col1, col2, col3, col4, col5
FROM table2
GROUP BY col1, col2, col3, col4, col5
HAVING count(*) > 1

我可以使用以下查询删除一个副本:

WITH cte
AS ( SELECT col1, col2, col3, col4, col5,
row_number() OVER( PARTITION BY col1, col2, col3, col4, col5 ORDER BY col1 ) AS [rn]
FROM table2
)
DELETE cte WHERE [rn] > 1

但我想要的是删除找到的所有重复项。

要说清楚有两行:

            Col1    Col2    Col3    Col4    Col5    Col6
            1       2       3       4       5       TEXAS
            1       2       3       4       5       NEW YORK

因此,上面发布的第一个查询会给我一个结果:

Occurence   Col1    Col2    Col3    Col4    Col5
2           1       2       3       4       5   

第二个查询将删除上述任何一个(即TEXAS或NEW YORK)。 我想删除TEXAS和NEW YORK。

我的桌子是这样的:

table1 x 行数。

table2 x + y 行数,即它包含table1的所有行加上一些。

以上面的例子为例,

TEXAS同时适用于table1table2

TEXAS在table2中出现两次。

但纽约仅在table2

提供

当我将数据从table2复制到table1时,只能插入NEW YORK(应插入)。

使用 DISTINCT 查询或 rn > 1 时,table2和<{1}}中的TEXAS仍然存在(发生一次)< strong> INSERT 会失败。

3 个答案:

答案 0 :(得分:0)

使用ROW_NUMBER OVER PARTITION BY你可以获得重复的行。在Delete from Inner JOIN表和CTE的帮助下,您可以删除重复的行。

WITH cte
     AS (SELECT col1,col2,col3,col4,col5,
                Row_number() OVER(PARTITION BY col1, col2, col3, col4, col5
                    ORDER BY col1) AS [rn]
         FROM   table2)
DELETE A
FROM   table2 a
       JOIN cte b
         ON a.col1 = b.col1
            AND a.col2 = b.col2
            AND a.col3 = b.col3
            AND a.col4 = b.col4
            AND a.col5 = b.col5
WHERE  rn > 1 

答案 1 :(得分:0)

在您的CTE中,您刚刚删除了不等于1的行。因此,它不允许删除任何一个德克萨斯州或纽约州。我略微更改了您的查询并获得[rn]的最大值并删除了具有max&gt;的行1。

WITH cte
AS 
(
SELECT  col1,col2,col3,col4, col5, MAX(rn) AS Max FROM (SELECT col1,col2,col3,col4, col5,
row_number() OVER(PARTITION BY col1,col2,col3,col4, col5 ORDER BY col1) AS [rn]
FROM table2) AS Table1 GROUP BY col1,col2,col3,col4, col5
)

DELETE cte WHERE [Max] > 1

试试这个。

答案 2 :(得分:0)

如果需要的只是将数据加载到table1中,则不必从table2中删除任何内容。以下查询应该足够了。

INSERT INTO table1(col1,col2,col3,col4,col5,col6)
SELECT * FROM table2 otr
WHERE NOT EXISTS(
                SELECT 1
                FROM table2 inr
                WHERE inr.col1=otr.col1
                AND inr.col2=otr.col2
                AND inr.col3=otr.col3
                AND inr.col4=otr.col4
                AND inr.col5=otr.col5
                GROUP BY inr.col1,
                         inr.col2,
                         inr.col3,
                         inr.col4,
                         inr.col5
                HAVING COUNT(1) > 1)