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

Jad*_*ias 54 t-sql ssms sql-server-2005

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

  1. 如果有,请指出哪里

  2. 如果还没有,请告诉我如何创建一个T-SQL帮助器来创建这样的代码.

ang*_*son 124

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

但是,以下是如何构建SQL以在一组列上获取重复项:

SELECT col1, col2, col3, col4
FROM table
GROUP BY col1, col2, col3, col4
HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

这将找到对于列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
Run Code Online (Sandbox Code Playgroud)

这两行在列col1-col4中共享公共值,因此,该SQL被认为是重复的.展开列列表以包含要为其分析的所有列.

  • 不应该,这是标准的SQL,没有什么特定的T-SQL.它应该与MySQL,SQLite,Oracle,Sybase,DB2等相同. (3认同)

Mik*_*ehr 62

如果您使用的是SQL Server 2005+,则可以使用以下代码查看所有行以及其他列:

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber
FROM table
Run Code Online (Sandbox Code Playgroud)

您还可以使用此技术删除(或以其他方式使用)重复项:

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
Run Code Online (Sandbox Code Playgroud)

ROW_NUMBER非常强大 - 你可以用它做很多事情 - 请参阅http://msdn.microsoft.com/en-us/library/ms186734.aspx上的BOL文章

  • +1教育我们如何删除.此外,你的代码片段还包括PK./死灵 (3认同)

Fer*_*cio 5

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

SELECT * FROM db WHERE col IN
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
    ORDER BY col
Run Code Online (Sandbox Code Playgroud)