diff --git a/数据库/去重.md b/数据库/去重.md index 6be0ac4..fdd9fde 100755 --- a/数据库/去重.md +++ b/数据库/去重.md @@ -1,15 +1,57 @@ -begin tran +# 数据去重方法 + +> SQL Server 数据去重常用方法 + +## 方法一:使用 DISTINCT ```sql -select distinct * into #temp from DataSyncStationSX -delete DataSyncStationSX -go -insert DataSyncStationSX select * from #temp Sqlclub -go -drop table #temp - -select * from DataSyncStationSX +SELECT DISTINCT * FROM TableName ``` -order by sid -commit \ No newline at end of file +## 方法二:临时表去重 + +```sql +BEGIN TRAN + +-- 1. 选中不重复的数据到临时表 +SELECT DISTINCT * INTO #temp FROM DataSyncStationSX + +-- 2. 删除原表数据 +DELETE FROM DataSyncStationSX + +-- 3. 从临时表导回 +INSERT INTO DataSyncStationSX SELECT * FROM #temp + +-- 4. 删除临时表 +DROP TABLE #temp + +COMMIT +``` + +## 方法三:ROW_NUMBER 去重 + +```sql +-- 删除重复数据,保留最新一条 +DELETE FROM TableName +WHERE ID IN ( + SELECT ID FROM ( + SELECT ID, ROW_NUMBER() OVER (PARTITION BY duplicate_column ORDER BY created_time DESC) AS rn + FROM TableName + ) t + WHERE rn > 1 +) +``` + +## 方法四:查找重复数据 + +```sql +-- 查找重复记录 +SELECT column1, column2, COUNT(*) as cnt +FROM TableName +GROUP BY column1, column2 +HAVING COUNT(*) > 1 +``` + +--- + +> ⚠️ 执行删除前请先备份数据! diff --git a/数据库/循环批量删除数据库表.md b/数据库/循环批量删除数据库表.md index a1137da..b4ff564 100755 --- a/数据库/循环批量删除数据库表.md +++ b/数据库/循环批量删除数据库表.md @@ -1,55 +1,58 @@ ---创建临时表 -```sql -create table #Man( -``` -id int identity(1,1), -tbName nvarchar(50) -) --往临时表插入数据 -```sql -insert into #Man -select name from sys.tables -where create_date<='2018-03-10 15:36:35.687' and name not in ('DeviceNetState','EphInfo','FilterStatistic','UserInfo','AlmInfo') -``` -order by create_date desc +# 循环批量删除数据库表 ---确认 -```sql -select * from #Man +> SQL Server 批量删除指定条件的表 -``` -commit -rollback -begin tran - - ---定义循环变量 -```sql -declare @i int -set @i = 1 -declare @count int -select @count = count(*) from #Man - -``` ---print @count +## 存储过程 ```sql -declare @str nvarchar(500) -declare @tb nvarchar(50) +-- 创建临时表存储表名 +CREATE TABLE #Man ( + id INT IDENTITY(1,1), + tbName NVARCHAR(50) +) -``` -while(@i <= @count) begin +-- 插入要删除的表名(排除保留表) +INSERT INTO #Man +SELECT name +FROM sys.tables +WHERE create_date <= '2018-03-10 15:36:35.687' + AND name NOT IN ('DeviceNetState', 'EphInfo', 'FilterStatistic', 'UserInfo', 'AlmInfo') +ORDER BY create_date DESC -```sql -select @tb = isnull(tbName, '') from #Man where id = @i -``` ---循环执行语句 -```sql -set @str = 'drop table [' + @tb+ ']' -``` -exec(@str) +-- 确认要删除的表 +SELECT * FROM #Man -```sql -set @str = '' -set @i = @i + 1 +-- 开始删除 +DECLARE @i INT = 1 +DECLARE @count INT +SELECT @count = COUNT(*) FROM #Man + +DECLARE @str NVARCHAR(500) +DECLARE @tb NVARCHAR(50) + +WHILE (@i <= @count) +BEGIN + SELECT @tb = ISNULL(tbName, '') FROM #Man WHERE id = @i + + SET @str = 'DROP TABLE [' + @tb + ']' + EXEC(@str) + + SET @i = @i + 1 +END + +-- 清理临时表 +DROP TABLE #Man ``` -end \ No newline at end of file + +--- + +## 安全建议 + +1. **先 SELECT 确认**:删除前先只 SELECT,确认无误再执行 DELETE +2. **排除保留表**:一定要排除系统表和重要业务表 +3. **备份**:生产环境先备份再执行 +4. **分批执行**:大量删除时分批进行,避免锁表时间过长 + +--- + +> ⚠️ **警告**:此操作不可逆,执行前务必确认!