Sql 不使用公共表表达式(CTE)删除重复记录

Sql 不使用公共表表达式(CTE)删除重复记录,sql,sql-server,Sql,Sql Server,我知道如何使用CTE删除重复记录 我们如何在不使用CTE的情况下实现这一点[采访问题] 可能吗 示例:包含以下数据的表: name salary ----------------- Husain 20000.00 Husain 20000.00 Husain 20000.00 Munavvar 50000.00 Munavvar 50000.00 删除重复记录后 表应包含如下数据: name salary ----------------- Husain 200

我知道如何使用CTE删除重复记录

我们如何在不使用CTE的情况下实现这一点[采访问题]

可能吗

示例:包含以下数据的表:

name     salary
-----------------
Husain   20000.00
Husain   20000.00
Husain   20000.00
Munavvar 50000.00
Munavvar 50000.00
删除重复记录后 表应包含如下数据:

name     salary
-----------------
Husain   20000.00
Munavvar 50000.00

  • 通过子查询和
    按COUNT(*)>1分组

    假设您希望根据两列
    col1
    col2
    查找重复项:

    查询以列出所有重复项:

    SELECT t.*
    FROM dbo.TableName t
    INNER JOIN 
    (
       SELECT [col1], [col2], Cnt = COUNT(*)
       FROM dbo.TableName t
       GROUP BY [col1], [col2]
       HAVING COUNT(*) > 1
    ) Duplicates
    ON t.[col1] = Duplicates.[col1] AND t.[col2] = Duplicates.[col2]
    
    删除它们:

    DELETE dbo.TableName
    FROM dbo.TableName t
    INNER JOIN 
    (
       SELECT [col1], [col2], Cnt = COUNT(*)
       FROM dbo.TableName t
       GROUP BY [col1], [col2]
       HAVING COUNT(*) > 1
    ) Duplicates
    ON t.[col1] = Duplicates.[col1] AND t.[col2] = Duplicates.[col2]
    

    通过子查询和
    按COUNT(*)>1分组

    假设您希望根据两列
    col1
    col2
    查找重复项:

    查询以列出所有重复项:

    SELECT t.*
    FROM dbo.TableName t
    INNER JOIN 
    (
       SELECT [col1], [col2], Cnt = COUNT(*)
       FROM dbo.TableName t
       GROUP BY [col1], [col2]
       HAVING COUNT(*) > 1
    ) Duplicates
    ON t.[col1] = Duplicates.[col1] AND t.[col2] = Duplicates.[col2]
    
    删除它们:

    DELETE dbo.TableName
    FROM dbo.TableName t
    INNER JOIN 
    (
       SELECT [col1], [col2], Cnt = COUNT(*)
       FROM dbo.TableName t
       GROUP BY [col1], [col2]
       HAVING COUNT(*) > 1
    ) Duplicates
    ON t.[col1] = Duplicates.[col1] AND t.[col2] = Duplicates.[col2]
    

    如果必须删除保留一行的重复行,则可以使用SQL中的row_NUMBER()函数来删除。删除行号大于1的所有行。假设您知道ROW_NUMBER()和分区是如何工作的。如果没有,您可以在msdn上获得更多信息

    DELETE A
    FROM
    (
    SELECT name,salary, ROW_NUMBER() OVER (PARTITION BY name,salary ORDER BY name) AS rn
    FROM Tab
    ) A
    WHERE A.rn > 1
    

    只要对@TimSchmelter的回复稍加留意,它就会删除所有存在的重复项。请注意差异,您可以根据需要使用任何一种。

    如果必须删除保留一行的重复行,可以使用SQL中的row_NUMBER()函数来执行此操作。删除行号大于1的所有行。假设您知道ROW_NUMBER()和分区是如何工作的。如果没有,您可以在msdn上获得更多信息

    DELETE A
    FROM
    (
    SELECT name,salary, ROW_NUMBER() OVER (PARTITION BY name,salary ORDER BY name) AS rn
    FROM Tab
    ) A
    WHERE A.rn > 1
    
    只要对@TimSchmelter的回复稍加留意,它就会删除所有存在的重复项。请注意差异,您可以根据自己的要求使用任何一种。

    从重复命令表中选择*

    select*from DuplicateRcordTable
    公共表表达式(CTE)最常用的用法是从没有主键的表中删除重复记录

    WITH a as
    (
    SELECT A,ROW_NUMBER() OVER(PARTITION by A, B ORDER BY A) 
    AS duplicateRecCount dbo.A
    )
    --Now Delete Duplicate Records
    DELETE FROM A
    WHERE duplicateRecCount > 1 [enter image description here][1]
    

    公共表表达式(CTE)最常用的用法是从没有主键的表中删除重复记录

    WITH a as
    (
    SELECT A,ROW_NUMBER() OVER(PARTITION by A, B ORDER BY A) 
    AS duplicateRecCount dbo.A
    )
    --Now Delete Duplicate Records
    DELETE FROM A
    WHERE duplicateRecCount > 1 [enter image description here][1]
    

    我们还可以通过使用游标或使用另一个删除语句从表中删除重复记录。下面的代码spinets使用游标删除重复的记录

      DECLARE @A nvarchar(50), @B nvarchar(50) , @C nvarchar(50), @TotalDuplicate INT ; 
    
    
    
    DECLARE a_cursor CURSOR FOR   
    SELECT A, B  ,C ,COUNT(1)-1 AS TotalDuplicate
    FROM A  
    GROUP BY  A, B  ,C 
    HAVING COUNT(1)>1
    
    OPEN a_cursor  
    
    FETCH NEXT FROM a_cursor INTO @A, @B,@C,@TotalDuplicate  
    
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
    
        DELETE TOP (@TotalDuplicate) FROM A WHERE A=@A AND B=@B AND C=@C 
    
        FETCH NEXT FROM a_cursor INTO @A, @B,@C,@TotalDuplicate  
    
    END
    
    CLOSE a_cursor;  
    DEALLOCATE a_cursor;  
    

    我们还可以通过使用游标或使用另一个删除语句从表中删除重复记录。下面的代码spinets使用游标删除重复的记录

      DECLARE @A nvarchar(50), @B nvarchar(50) , @C nvarchar(50), @TotalDuplicate INT ; 
    
    
    
    DECLARE a_cursor CURSOR FOR   
    SELECT A, B  ,C ,COUNT(1)-1 AS TotalDuplicate
    FROM A  
    GROUP BY  A, B  ,C 
    HAVING COUNT(1)>1
    
    OPEN a_cursor  
    
    FETCH NEXT FROM a_cursor INTO @A, @B,@C,@TotalDuplicate  
    
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
    
        DELETE TOP (@TotalDuplicate) FROM A WHERE A=@A AND B=@B AND C=@C 
    
        FETCH NEXT FROM a_cursor INTO @A, @B,@C,@TotalDuplicate  
    
    END
    
    CLOSE a_cursor;  
    DEALLOCATE a_cursor;  
    
    现在,截断原始表

    Truncate table Emp_Details 
    
    同样,将记录从临时表插入Emp_详细信息

    insert Emp_Details (Name, Salary, Address)
    
    Select Name, Age, Address from #temp
    
    现在,截断原始表

    Truncate table Emp_Details 
    
    同样,将记录从临时表插入Emp_详细信息

    insert Emp_Details (Name, Salary, Address)
    
    Select Name, Age, Address from #temp
    

    是的,这是可能的。看这里是的,这是可能的。看这里谢谢蒂姆的快速反应。但这将删除所有具有重复值的记录。我想删除重复的数据。@Munavvar:那么除了一个数据外,其他数据都删除了吗?以下是一些方法:感谢Tim的快速响应。但这将删除所有具有重复值的记录。我想删除重复的数据。@Munavvar:那么除了一个数据外,其他数据都删除了吗?以下是一些方法:感谢阿肯沙的回应。但它也会删除所有记录,而不会。确保仅使用定义“重复”记录的列进行分区。是,它将删除所有行。。请尝试给定的示例(检查问题)您是否正在运行我所共享的内容(现在使用您的列名编辑)?如果您了解问题的症结所在,就可以编写定义重复行的列名。但这应该100%有效:)@Munavvar:我认为您需要一个解决方案,而不需要使用CTE和rdbms特定的排序函数,如
    行数
    。您确定面试官不想要一个不需要sql Server>=2005的ANSI sql解决方案吗?谢谢Akanksha的回复。但它也会删除所有记录,而不会。确保仅使用定义“重复”记录的列进行分区。是,它将删除所有行。。请尝试给定的示例(检查问题)您是否正在运行我所共享的内容(现在使用您的列名编辑)?如果您了解问题的症结所在,就可以编写定义重复行的列名。但这应该100%有效:)@Munavvar:我认为您需要一个解决方案,而不需要使用CTE和rdbms特定的排序函数,如
    行数
    。您确定面试官不想要不需要sql Server>=2005的ANSI sql解决方案吗?