数据库查询出来的结构:
 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 行受影响)结果把最好一条删除掉了,我的意思是想让 每一条记录进行比较,不是字段比较,现在的这条语句就是比较字段的,只要字段符合条件就删除。我想要的结果是最后一条是不应该删除的,只要每条记录比较如果不相同就不要删除的。

解决方案 »

  1.   

    http://topic.csdn.net/u/20080626/00/43d0d10c-28f1-418d-a05b-663880da278a.html?85256
      

  2.   

    --> 生成测试数据表: [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'
    -->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 行受影响)
    */
      

  3.   


     sid sname sex classid  
     213 1 男          64
     221 1 男          67
     231 2 男          68
     269 2 男          64
     270 2 男          64
    我想要的结果是,执行SQL语句,删除sid是270的记录,因为270和269是完全相同的重复的。
      

  4.   


     sid sname sex classid   
     213 1     男       64
     221 1    男       67
     231 2    男       68
     269 2    男       64
     270 2    男       64
    想要的结果是,删除重复记录 ,应该删除270记录或者269记录,他们2个事完全重复的。就要这样的结果。
      

  5.   

    ----------------------------------------------------------------------------------
    -- 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 行受影响)

    */
      

  6.   

    -->SQL2005查询如下:
    ;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 行受影响)
    */
      

  7.   

    delete tb 
    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
      

  8.   

    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 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 行)
    */
      

  9.   

    --12楼可行,如下也行.
    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 行)
    */
      

  10.   

    if object_id('[tb]') is not null drop table [tb]
    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