MS Access有一个按钮,生成SQL代码查找重复的行。我不知道如果SQL Server 2005/2008枭雄Studio有这个。
好吧,如果你有整个行作为在表格的重复,你至少不会有一个主键建立该表,否则至少主键值会有所不同。
然而,这里是如何建立一个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,被认为是重复的。展开列的列表包含了所有你要分析此为列。
如果您使用的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文章
我发现这个解决方案时,我需要转储与一个或多个重复字段整个行,但我不希望在表中键入每个字段的名称:
SELECT * FROM db WHERE col IN
(SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
ORDER BY col
据我所知,没有。只需通过一个表的所有领域作出select语句分组,并使用having子句筛选其中计数大于1。
如果行被复制,除了由键,然后不包括在选择领域的关键。
另一种方法可以做到这一点是通过对自身加入一个表。
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迫使主键是不同的。