记录学员平日行为的操行表:
![]()
Code
CREATE TABLE [dbo].[ConductInfo] (
[NID] [int] IDENTITY (1, 1) NOT NULL ,
[GUID] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BillID] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NULL , --单据编号,对应某一具体事件
[StudentId] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NULL , --学号,唯一对应某一位学员
[StudentName] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
[OccurDate] [datetime] NULL ,
[OccurPlace] [nvarchar] (16) COLLATE Chinese_PRC_CI_AS NULL ,
[Describe] [nvarchar] (48) COLLATE Chinese_PRC_CI_AS NULL ,
[ConductValue] [numeric](4, 1) NULL , --扣除或添加加分值
) ON [PRIMARY]
GO
该表由于程序漏洞与误操作,被加入大量重复数据,现需清理表内重复数据
重复数据判断条件:学号与单据编号相同即为重复数据
思路:学号与单据编号分组并找出重复数据,并找出每组最大id号放入临时表中,1.后按临时表删除数据,反复执行直至删除所有重复数据(注意:每执行一次后,删除临时表建立新的临时表)。2.按重复数据的学号写游标每次删除不等于最大id号且等于游标学号的数据
代码:
![]()
Code
select BillID,StudentId,count(*) num,max(NID) maxid into #temp from dbo.ConductInfo group by BillID,StudentId having count(*) > 1
declare @StudentId nvarchar(16),@maxid int
DECLARE C_Cursor CURSOR FOR
SELECT StudentId,maxid
FROM #temp
OPEN C_Cursor
FETCH NEXT FROM C_Cursor into @StudentId,@maxid
WHILE @@FETCH_STATUS = 0
BEGIN
delete dbo.ConductInfo where (BillID is null and StudentId = @StudentId) and NID <> @maxid
FETCH NEXT FROM C_Cursor into @StudentId,@maxid
END
CLOSE C_Cursor
DEALLOCATE C_Cursor
这种方法步骤虽然复杂一点,但逻辑上就显得简单了,易懂;本人喜欢用临时表,临时表可以让执行步骤细致一点,但逻辑要简单一些,不至于写太复杂的SQL语句。