如何删除表中多余的重复记录(多个字段),只留有rowid最小的记录

szlixiaolong 2015-05-08 09:47:04
CREATE TABLE [t_da_saleman_daysumb] (
[Col001] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col002] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col003] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col004] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col005] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col006] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col007] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col008] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col009] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col010] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col011] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col012] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col013] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col014] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col015] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col016] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col017] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL ,
[Col018] [varchar] (8000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
col001代表ID号,col002代表编号,col003代表日期,col004代表门店编号,col005代表操作员ID,

使用以下语句就可以查询重复的字段:col002,col003,col004,col005,如何通过SQL处理只保留重复数据中的一行就可以了。

select col002,col003,col004,col005 from t_da_saleman_daysumb group by col002,col003,col004,col005 having count(*)>1


88443 6933407000257 2015-4-26 000005 5001 1.8706 0.00 0.00 1.00 4.00 0.00 0.00 0.00 0.00 0.00 4.00 0.02 0
160154 6933407000257 2015-4-26 000005 5001 1.8706 0.00 0.00 1.00 4.00 0.00 0.00 0.00 0.00 0.00 4.00 0.02 0

88440 6933407000257 2015-3-28 000005 5002 1.8706 0.00 0.00 1.00 4.00 0.00 0.00 0.00 0.00 0.00 4.00 0.02 0
160151 6933407000257 2015-3-28 000005 5002 1.8706 0.00 0.00 1.00 4.00 0.00 0.00 0.00 0.00 0.00 4.00 0.02 0


...全文
371 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
还在加载中灬 2015-05-08
  • 打赏
  • 举报
回复
引用 5 楼 szlixiaolong 的回复:
[quote=引用 3 楼 ky_min 的回复:]
DELETE t_da_saleman_daysumb
WHERE EXISTS(
	SELECT 1 FROM t_da_saleman_daysumb T
	WHERE t_da_saleman_daysumb.col002=T.col002
		AND t_da_saleman_daysumb.col003=T.col003
		AND t_da_saleman_daysumb.col004=T.col004
		AND t_da_saleman_daysumb.col005=T.col005
		AND t_da_saleman_daysumb.col001>T.col001)
try
可以了,请写一下,显示表中多余的重复记录(多个字段)。[/quote]
--你如果先执行删除,是看不到那些数据了
SELECT * FROM t_da_saleman_daysumb
WHERE EXISTS(
    SELECT 1 FROM t_da_saleman_daysumb T
    WHERE t_da_saleman_daysumb.col002=T.col002
        AND t_da_saleman_daysumb.col003=T.col003
        AND t_da_saleman_daysumb.col004=T.col004
        AND t_da_saleman_daysumb.col005=T.col005
        AND t_da_saleman_daysumb.col001>T.col001)
还在加载中灬 2015-05-08
  • 打赏
  • 举报
回复
--你如果先执行删除,是看不到那些数据了
SELECT * FROM t_da_saleman_daysumb
WHERE EXISTS(
	SELECT 1 FROM t_da_saleman_daysumb T
	WHERE t_da_saleman_daysumb.col002=T.col002
		AND t_da_saleman_daysumb.col003=T.col003
		AND t_da_saleman_daysumb.col004=T.col004
		AND t_da_saleman_daysumb.col005=T.col005
		AND t_da_saleman_daysumb.col001>T.col001)
在路上_- 2015-05-08
  • 打赏
  • 举报
回复

delete t_da_saleman_daysumb
from t_da_saleman_daysumb a
  left join (select min(col001) col01 from t_da_saleman_daysumb group by col002,col003,col004,col005) t
    on a.col001=t.col001
where t.col001 is null
szlixiaolong 2015-05-08
  • 打赏
  • 举报
回复
引用 3 楼 ky_min 的回复:
DELETE t_da_saleman_daysumb
WHERE EXISTS(
	SELECT 1 FROM t_da_saleman_daysumb T
	WHERE t_da_saleman_daysumb.col002=T.col002
		AND t_da_saleman_daysumb.col003=T.col003
		AND t_da_saleman_daysumb.col004=T.col004
		AND t_da_saleman_daysumb.col005=T.col005
		AND t_da_saleman_daysumb.col001>T.col001)
try
可以了,请写一下,显示表中多余的重复记录(多个字段)。
在路上_- 2015-05-08
  • 打赏
  • 举报
回复

select min(col001) col001
into #t
from t_da_saleman_daysumb
group by col002,col003,col004,col005;

deletee from t_da_saleman_daysumb
where col001 not in (select col001 from #t)
还在加载中灬 2015-05-08
  • 打赏
  • 举报
回复
DELETE t_da_saleman_daysumb
WHERE EXISTS(
	SELECT 1 FROM t_da_saleman_daysumb T
	WHERE t_da_saleman_daysumb.col002=T.col002
		AND t_da_saleman_daysumb.col003=T.col003
		AND t_da_saleman_daysumb.col004=T.col004
		AND t_da_saleman_daysumb.col005=T.col005
		AND t_da_saleman_daysumb.col001>T.col001)
try
szlixiaolong 2015-05-08
  • 打赏
  • 举报
回复
引用 1 楼 ky_min 的回复:
;WITH CTE AS(
	SELECT *,ROW_NUMBER()OVER(PARTITION BY col002,col003,col004,col005 ORDER BY col001)RN
	FROM t_da_saleman_daysumb
)
DELETE CTE
WHERE RN>1
服务器: 消息 170,级别 15,状态 1,行 1 第 1 行: ';' 附近有语法错误。 服务器: 消息 195,级别 15,状态 1,行 2 'ROW_NUMBER' 不是可以识别的 函数名。 这是SQL2000数据库。
还在加载中灬 2015-05-08
  • 打赏
  • 举报
回复
;WITH CTE AS(
	SELECT *,ROW_NUMBER()OVER(PARTITION BY col002,col003,col004,col005 ORDER BY col001)RN
	FROM t_da_saleman_daysumb
)
DELETE CTE
WHERE RN>1

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧