有没有大佬来解答一下啊带一下思路

DiaoGe1201 2019-11-29 08:45:50
题1.1、删除表的重复记录
如果记录完全相同才算重复记录,请书写此种情况下的SQL语句;
如果有id主键(数字,自增1模式),请书写此种情况下的SQL语句。
...全文
698 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2019-12-02
  • 打赏
  • 举报
回复
引用 3 楼 文盲老顾 的回复:
[quote=引用 1 楼 吉普赛的歌 的回复:] ; with cte as( Select row_number() over (order by id desc) rid,* From tb ) Delete from cte where rid >1
直接delete from cte能实现物理删除? 如果我cte中有join会是什么结果?[/quote]
USE tempdb
GO
IF OBJECT_ID('ta') IS NOT NULL
DROP TABLE ta
GO
CREATE TABLE ta(
	id INT IDENTITY(1,1) PRIMARY KEY,
	n VARCHAR(10)	
)
GO
INSERT INTO ta(n) VALUES ('a')
INSERT INTO ta(n) VALUES ('b')
INSERT INTO ta(n) VALUES ('b')
GO
--删除前
SELECT * FROM ta
/*
id	n
1	a
2	b
3	b
 */
--删除
;WITH cte AS (
	SELECT ROW_NUMBER() OVER (PARTITION BY n ORDER BY id DESC) AS rid,* FROM ta
)
DELETE FROM cte WHERE rid>1

--删除后
SELECT * FROM ta
/*
id	n
1	a
3	b
 */
至于多表的, 你自己试下吧。 个人不建议多表删除还这么用,哪怕能实现,因为可读性不好, 容易误操作。
stelf 2019-12-02
  • 打赏
  • 举报
回复
第一种情况下 用 分析函数 row_number 人为的给相同数据编号,然后根据编号进行删除。参考楼上 第一种的都能解决,第二种情况就是小意思了
文盲老顾 2019-11-30
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
; with cte as( Select row_number() over (order by id desc) rid,* From tb ) Delete from cte where rid >1
直接delete from cte能实现物理删除? 如果我cte中有join会是什么结果?
极客诗人 2019-11-30
  • 打赏
  • 举报
回复
第一个 通过全分组来获取去重 第二个的话就是通过id分组
吉普赛的歌 版主 2019-11-30
  • 打赏
  • 举报
回复
; with cte as( Select row_number() over (order by id desc) rid,* From tb ) Delete from cte where rid >1

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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