如何让T-SQL代码找到重复项?

时间:2009-08-03 14:12:06

标签: sql-server-2005 tsql ssms

MS Access有一个按钮,用于生成用于查找重复行的sql代码。我不知道SQL Server 2005/2008 Managment Studio是否具有此功能。

  1. 如果有,请指出

  2. 如果还没有,请告诉我如何使用T-SQL帮助程序来创建这样的代码。

5 个答案:

答案 0 :(得分:119)

好吧,如果你的表中有整行作为重复行,你至少没有为该表设置主键,否则至少主键值会有所不同。

但是,这里是如何构建一个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被认为是重复的。展开列列表以包含要为其分析的所有列。

答案 1 :(得分:59)

如果您使用的是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文章

答案 2 :(得分:5)

当我需要使用一个或多个重复字段转储整个行但我不想在表中键入每个字段名称时,我找到了这个解决方案:

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

答案 3 :(得分:2)

AFAIK,它没有。只需对表的所有字段进行select语句分组,然后使用having子句进行过滤,其中count大于1。

如果您的行除了密钥以外都是重复的,那么请不要在选择字段中包含该密钥。

答案 4 :(得分: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

换句话说: 如果表aBase的行等于aDupes的行(基于ColA和ColB),则该匹配的反映也将为真-aDupes的行等于基于ColA和ColB的aBase行。因此,这两个匹配项都将返回到结果集中。

通过任意选择表之一具有较低键的所有结果来缩小/消除这种反射。

<或>没关系,只要键不同即可。

这还可以过滤掉一行上的匹配项,因为 aBase.Pkey 会强制主键不同。