如何获得T-SQL代码来查找重复?

问题描述 投票:51回答:5

MS Access有一个按钮,生成SQL代码查找重复的行。我不知道如果SQL Server 2005/2008枭雄Studio有这个。

  1. 如果有,请点这里
  2. 如果没有,请告诉我,我怎么能有这样的代码创建一个T-SQL帮手。
sql-server-2005 tsql ssms
5个回答
121
投票

好吧,如果你有整个行作为在表格的重复,你至少不会有一个主键建立该表,否则至少主键值会有所不同。

然而,这里是如何建立一个SQL得到重复了一组列:

SELECT col1, col2, col3, col4
FROM table
GROUP BY col1, col2, col3, col4
HAVING COUNT(*) > 1

这将发现其行,对列COL1-COL4,具有值相同的组合,不止一次。

例如,下表中,行2 + 3将是重复的:

PK    col1    col2    col3    col4    col5
1       1       2       3       4      6
2       1       3       4       7      7
3       1       3       4       7      10
4       2       3       1       4      5

两排列COL1-COL4共享公共值,并且因此,由该SQL,被认为是重复的。展开列的列表包含了所有你要分析此为列。


61
投票

如果您使用的SQL Server 2005 +,你可以用下面的代码,看看其他的栏沿所有行:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
FROM table

您也可以删除(或以其它方式使用)复制使用这种技术:

WITH cte AS
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
    FROM table
)
DELETE FROM cte WHERE DuplicateRowNumber > 1

ROW_NUMBER是非常强大 - 有很多,你可以用它做 - 在http://msdn.microsoft.com/en-us/library/ms186734.aspx看到它的BOL文章


5
投票

我发现这个解决方案时,我需要转储与一个或多个重复字段整个行,但我不希望在表中键入每个字段的名称:

SELECT * FROM db WHERE col IN
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
    ORDER BY col

2
投票

据我所知,没有。只需通过一个表的所有领域作出select语句分组,并使用having子句筛选其中计数大于1。

如果行被复制,除了由键,然后不包括在选择领域的关键。


0
投票

另一种方法可以做到这一点是通过对自身加入一个表。

SELECT *
FROM dbo.TableA aBase
JOIN dbo.TableA aDupes ON aDupes.ColA = aBase.ColA AND
                          aDupes.ColB = aBase.ColB
WHERE aBase.Pkey < aDupes.Pkey

注:aBase.Pkey <aDupes.Pkey是因为有对自身加入一个表将创建每场比赛两行,因为条件将永远是真实的两倍。

换句话说:如果表ABASE具有行等于从aDupes行(基于可乐COLB),即匹配的反射也将成立的 - 也就是说aDupes具有行等于基于可乐COLB行ABASE。因此,这两个比赛将在结果集中返回。

缩小这个向下/消除由任意挑选所有结果,其中的表中的一个具有下键此反射。

<或>不要紧,只要密钥是不同的。

这也需要照顾滤除的与行自身相匹配,因为aBase.Pkey <aDupes.Pkey迫使主键是不同的。

© www.soinside.com 2019 - 2024. All rights reserved.