Sql 不使用公共表表达式(CTE)删除重复记录
我知道如何使用CTE删除重复记录 我们如何在不使用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
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解决方案吗?