数据库查询出来的结构:
sid sname sex classid
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64
现在我执行sql语句:
delete from student where sname in(select sname from student group by sname having count(sname)>1) and classid in(select classid from student group by classid having count(classid)>1)and sid not in(select min(sid) from student group by classid having count(classid)>1)(1 行受影响)结果把最好一条删除掉了,我的意思是想让 每一条记录进行比较,不是字段比较,现在的这条语句就是比较字段的,只要字段符合条件就删除。我想要的结果是最后一条是不应该删除的,只要每条记录比较如果不相同就不要删除的。
sid sname sex classid
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64
现在我执行sql语句:
delete from student where sname in(select sname from student group by sname having count(sname)>1) and classid in(select classid from student group by classid having count(classid)>1)and sid not in(select min(sid) from student group by classid having count(classid)>1)(1 行受影响)结果把最好一条删除掉了,我的意思是想让 每一条记录进行比较,不是字段比较,现在的这条语句就是比较字段的,只要字段符合条件就删除。我想要的结果是最后一条是不应该删除的,只要每条记录比较如果不相同就不要删除的。
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([sid] [int],[sname] [int],[sex] [nvarchar](10),[classid] [int])
INSERT INTO [tb]
SELECT '213','1','男','64' UNION ALL
SELECT '221','1','男','67' UNION ALL
SELECT '231','2','男','68' UNION ALL
SELECT '269','2','男','64'
-->SQL查询如下:
DELETE tb
WHERE EXISTS(
SELECT 1
FROM tb t
WHERE sname = tb.sname
AND [sid]>tb.[sid]
)SELECT * FROM [tb]
/*
sid sname sex classid
----------- ----------- ---------- -----------
221 1 男 67
269 2 男 64(2 行受影响)
*/
sid sname sex classid
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64
270 2 男 64
我想要的结果是,执行SQL语句,删除sid是270的记录,因为270和269是完全相同的重复的。
sid sname sex classid
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64
270 2 男 64
想要的结果是,删除重复记录 ,应该删除270记录或者269记录,他们2个事完全重复的。就要这样的结果。
-- Author : htl258(Tony)
-- Date : 2010-06-08 22:43:34
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258
------------------------------------------------------------------------------------> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([sid] [int],[sname] [int],[sex] [nvarchar](10),[classid] [int])
INSERT INTO [tb]
SELECT '213','1','男','64' UNION ALL
SELECT '221','1','男','67' UNION ALL
SELECT '231','2','男','68' UNION ALL
SELECT '269','2','男','64' UNION ALL
SELECT '270','2','男','64'--SELECT * FROM [tb]-->SQL查询如下:
DELETE tb
WHERE EXISTS(
SELECT 1
FROM tb t
WHERE CHECKSUM([sname], [sex], [classid]) = CHECKSUM(tb.[sname], tb.[sex], tb.[classid])
AND SID<tb.sid
)
SELECT * FROM tb
/*
sid sname sex classid
----------- ----------- ---------- -----------
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64(4 行受影响)
*/
;WITH t AS
(
SELECT rn=ROW_NUMBER()OVER(PARTITION BY sname,sex,classid ORDER BY SID),*
FROM tb
)
DELETE t WHERE rn>1SELECT * FROM tb
/*
sid sname sex classid
----------- ----------- ---------- -----------
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64(4 行受影响)
*/
where exists(select 1 from tb t where t.sname=tb.sname and t.sex=tb.sex and t.classid=tb.classid and t.sid<tb.sid)
go
insert into tb values(213 ,1 ,'男', 64)
insert into tb values(221 ,1 ,'男', 67)
insert into tb values(231 ,2 ,'男', 68)
insert into tb values(269 ,2 ,'男', 64)
insert into tb values(270 ,2 ,'男', 64)
godelete tb from tb t where sid not in (select max(sid) from tb where sname = t.sname and sex = t.sex and classid = t.classid)select * from tbdrop table tb/*
sid sname sex classid
----------- ---------- ---------- -----------
213 1 男 64
221 1 男 67
231 2 男 68
270 2 男 64(所影响的行数为 4 行)
*/create table tb(sid int,sname varchar(10),sex varchar(10),classid int)
insert into tb values(213 ,1 ,'男', 64)
insert into tb values(221 ,1 ,'男', 67)
insert into tb values(231 ,2 ,'男', 68)
insert into tb values(269 ,2 ,'男', 64)
insert into tb values(270 ,2 ,'男', 64)
godelete tb from tb t where sid not in (select min(sid) from tb where sname = t.sname and sex = t.sex and classid = t.classid)select * from tbdrop table tb/*
sid sname sex classid
----------- ---------- ---------- -----------
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64(所影响的行数为 4 行)
*/
create table tb(sid int,sname varchar(10),sex varchar(10),classid int)
insert into tb values(213 ,1 ,'男', 64)
insert into tb values(221 ,1 ,'男', 67)
insert into tb values(231 ,2 ,'男', 68)
insert into tb values(269 ,2 ,'男', 64)
insert into tb values(270 ,2 ,'男', 64)
godelete tb from tb t where exists (select 1 from tb where sname = t.sname and sex = t.sex and classid = t.classid and sid > t.sid)select * from tbdrop table tb/*
sid sname sex classid
----------- ---------- ---------- -----------
213 1 男 64
221 1 男 67
231 2 男 68
270 2 男 64(所影响的行数为 4 行)
*/
create table tb(sid int,sname varchar(10),sex varchar(10),classid int)
insert into tb values(213 ,1 ,'男', 64)
insert into tb values(221 ,1 ,'男', 67)
insert into tb values(231 ,2 ,'男', 68)
insert into tb values(269 ,2 ,'男', 64)
insert into tb values(270 ,2 ,'男', 64)
godelete tb from tb t where exists (select 1 from tb where sname = t.sname and sex = t.sex and classid = t.classid and sid < t.sid)select * from tbdrop table tb/*
sid sname sex classid
----------- ---------- ---------- -----------
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64(所影响的行数为 4 行)
*/
go
create table [tb]([sid] int,[sname] int,[sex] varchar(2),[classid] int)
insert [tb]
select 213,1,'男',64 union all
select 221,1,'男',67 union all
select 231,2,'男',68 union all
select 269,2,'男',64 union all
select 270,2,'男',64declare @sql varchar(max)select @sql = isnull(@sql+' and ','')+'r.'+name+' = t.'+name
from syscolumns where id = object_id('tb','U') and name <> 'sid'select @sql = 'delete t from tb t,tb r
where t.sid > r.sid and ' + @sqlexec(@sql)select * from [tb]sid sname sex classid
----------- ----------- ---- -----------
213 1 男 64
221 1 男 67
231 2 男 68
269 2 男 64