现在的问题是:
表content 里面有字段:标题 公司名称 内容 联系方式
当标题和公司名称都重复的条件下,才筛选出这两条数据是重复的数据,筛选出来后再进行删除,只保留一条!
这语句我该怎么写`??
sql = "select 标题,公司名称 from content group by 标题,公司名称 having(*)>1"
上面的语名有问题嘛???

解决方案 »

  1.   

    --处理表重复记录(查询和删除)
    /******************************************************************************************************************************************************
    1、Num、Name相同的重复值记录,没有大小关系只保留一条
    2、Name相同,ID有大小关系时,保留大或小其中一个记录
    整理人:中国风(Roy)日期:2008.06.06
    ******************************************************************************************************************************************************/--1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理)--> --> (Roy)生成測試數據
     
    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
    Insert #T
    select 1,N'A',N'A1' union all
    select 2,N'A',N'A2' union all
    select 3,N'A',N'A3' union all
    select 4,N'B',N'B1' union all
    select 5,N'B',N'B2'
    Go
    --I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
    方法1:
    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)方法2:
    select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID方法3:
    select * from #T a where ID=(select min(ID) from #T where Name=a.Name)方法4:
    select a.* from #T a join #T b on a.Name=b.Name and a.ID>=b.ID group by a.ID,a.Name,a.Memo having count(1)=1 方法5:
    select * from #T a group by ID,Name,Memo having ID=(select min(ID)from #T where Name=a.Name)方法6:
    select * from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)=0方法7:
    select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID)方法8:
    select * from #T a where ID!>all(select ID from #T where Name=a.Name)方法9(注:ID为唯一时可用):
    select * from #T a where ID in(select min(ID) from #T group by Name)--SQL2005:方法10:
    select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID方法11:select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID) as MinID from #T a)T where MinID=1生成结果:
    /*
    ID          Name Memo
    ----------- ---- ----
    1           A    A1
    4           B    B1(2 行受影响)
    */
    --II、Name相同ID最大的记录,与min相反:
    方法1:
    Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID>a.ID)方法2:
    select a.* from #T a join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID order by ID方法3:
    select * from #T a where ID=(select max(ID) from #T where Name=a.Name) order by ID方法4:
    select a.* from #T a join #T b on a.Name=b.Name and a.ID<=b.ID group by a.ID,a.Name,a.Memo having count(1)=1 方法5:
    select * from #T a group by ID,Name,Memo having ID=(select max(ID)from #T where Name=a.Name)方法6:
    select * from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)=0方法7:
    select * from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID desc)方法8:
    select * from #T a where ID!<all(select ID from #T where Name=a.Name)方法9(注:ID为唯一时可用):
    select * from #T a where ID in(select max(ID) from #T group by Name)--SQL2005:方法10:
    select ID,Name,Memo from (select *,max(ID)over(partition by Name) as MinID from #T a)T where ID=MinID方法11:
    select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID desc) as MinID from #T a)T where MinID=1生成结果2:
    /*
    ID          Name Memo
    ----------- ---- ----
    3           A    A3
    5           B    B2(2 行受影响)
    */--2、删除重复记录有大小关系时,保留大或小其中一个记录
    --> --> (Roy)生成測試數據if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
    Insert #T
    select 1,N'A',N'A1' union all
    select 2,N'A',N'A2' union all
    select 3,N'A',N'A3' union all
    select 4,N'B',N'B1' union all
    select 5,N'B',N'B2'
    Go--I、Name相同ID最小的记录(推荐用1,2,3),保留最小一条
    方法1:
    delete a from #T a where  exists(select 1 from #T where Name=a.Name and ID<a.ID)方法2:
    delete a  from #T a left join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null方法3:
    delete a from #T a where ID not in (select min(ID) from #T where Name=a.Name)方法4(注:ID为唯一时可用):
    delete a from #T a where ID not in(select min(ID)from #T group by Name)方法5:
    delete a from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)>0方法6:
    delete a from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID)方法7:
    delete a from #T a where ID>any(select ID from #T where Name=a.Name)select * from #T生成结果:
    /*
    ID          Name Memo
    ----------- ---- ----
    1           A    A1
    4           B    B1(2 行受影响)
    */
    --II、Name相同ID保留最大的一条记录:方法1:
    delete a from #T a where  exists(select 1 from #T where Name=a.Name and ID>a.ID)方法2:
    delete a  from #T a left join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null方法3:
    delete a from #T a where ID not in (select max(ID) from #T where Name=a.Name)方法4(注:ID为唯一时可用):
    delete a from #T a where ID not in(select max(ID)from #T group by Name)方法5:
    delete a from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)>0方法6:
    delete a from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID desc)方法7:
    delete a from #T a where ID<any(select ID from #T where Name=a.Name)
    select * from #T
    /*
    ID          Name Memo
    ----------- ---- ----
    3           A    A3
    5           B    B2(2 行受影响)
    */--3、删除重复记录没有大小关系时,处理重复值
    --> --> (Roy)生成測試數據
     
    if not object_id('Tempdb..#T') is null
        drop table #T
    Go
    Create table #T([Num] int,[Name] nvarchar(1))
    Insert #T
    select 1,N'A' union all
    select 1,N'A' union all
    select 1,N'A' union all
    select 2,N'B' union all
    select 2,N'B'
    Go方法1:
    if object_id('Tempdb..#') is not null
        drop table #
    Select distinct * into # from #T--排除重复记录结果集生成临时表#truncate table #T--清空表insert #T select * from #    --把临时表#插入到表#T中--查看结果
    select * from #T/*
    Num         Name
    ----------- ----
    1           A
    2           B(2 行受影响)
    */--重新执行测试数据后用方法2
    方法2:alter table #T add ID int identity--新增标识列
    go
    delete a from  #T a where  exists(select 1 from #T where Num=a.Num and Name=a.Name and ID>a.ID)--只保留一条记录
    go
    alter table #T drop column ID--删除标识列--查看结果
    select * from #T/*
    Num         Name
    ----------- ----
    1           A
    2           B(2 行受影响)*/--重新执行测试数据后用方法3
    方法3:
    declare Roy_Cursor cursor local for
    select count(1)-1,Num,Name from #T group by Num,Name having count(1)>1
    declare @con int,@Num int,@Name nvarchar(1)
    open Roy_Cursor
    fetch next from Roy_Cursor into @con,@Num,@Name
    while @@Fetch_status=0
    begin 
        set rowcount @con;
        delete #T where Num=@Num and Name=@Name
        set rowcount 0;
        fetch next from Roy_Cursor into @con,@Num,@Name
    end
    close Roy_Cursor
    deallocate Roy_Cursor--查看结果
    select * from #T
    /*
    Num         Name
    ----------- ----
    1           A
    2           B(2 行受影响)
    */
      

  2.   

    四种方法教你如何用SQL语句删除重复记录。 
    问题:怎样把具有相同字段的纪录删除,只留下一条。 
    例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。name的内容不定,相同的记录数不定。 
    方案1: 
    1、将重复的记录记入temp1表: 
    select [标志字段id],count(*) into temp1 from [表名]
    group by [标志字段id]
    having count(*)>1
    2、将不重复的记录记入temp1表: 
    insert temp1
    select [标志字段id],count(*) from [表名]
    group by [标志字段id]
    having count(*)=1
    3、作一个包含所有不重复记录的表: 
    select * into temp2 from [表名]
    where 标志字段id in(select 标志字段id from temp1)
    4、删除重复表:delete [表名] 
    5、恢复表: 
    insert [表名]
    select * from temp2
    6、删除临时表: 
    drop table temp1
    drop table temp2
    方案2: 
    declare @max integer,@id integer
    declare cur_rows cursor local for 
    select id,count(*) from 表名 group by id having count(*) > 1
    open cur_rows
    fetch cur_rows into @id,@max
    while @@fetch_status=0
    begin
    select @max = @max -1
    set rowcount @max
    delete from 表名 where id = @id
    fetch cur_rows into @id,@max
    end
    close cur_rows
    set rowcount 0
    注:set rowcount @max - 1 表示当前缓冲区只容纳@max-1条记录﹐如果有十条重复的﹐就刪除 
    10条,一定会留一条的。也可以写成delete from 表名。
    方案3: 
    create table a_dist(id int,name varchar(20))
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    exec up_distinct 'a_dist','id'
    select * from a_dist
    create procedure up_distinct(@t_name varchar(30)
    ,@f_key varchar(30))
    --f_key表示是分组字段﹐即主键字段
    as
    begin
    declare @max integer,@id varchar(30) ,
    @sql varchar(7999) ,@type integer
    select @sql = 'declare cur_rows cursor 
    for select '+@f_key+' ,count(*) from ' 
    +@t_name +' group by ' +@f_key +' having count(*) > 1'
    exec(@sql)
    open cur_rows 
    fetch cur_rows into @id,@max 
    while @@fetch_status=0 
    begin 
    select @max = @max -1 
    set rowcount @max 
    select @type = xtype from syscolumns 
    where id=object_id(@t_name) and name=@f_key
    if @type=56
    select @sql = 'delete from '+@t_name+' 
    where ' + @f_key+' = '+ @id 
    if @type=167
    select @sql = 'delete from '+@t_name+' 
    where ' + @f_key+' = '+''''+ @id +'''' 
    exec(@sql)
    fetch cur_rows into @id,@max 
    end 
    close cur_rows 
    deallocate cur_rows
    set rowcount 0
    end
    select * from systypes
    select * from syscolumns where 
    id = object_id('a_dist')
    方案4: 
    可以用IGNORE_DUP_KEY: 
    create table dup (id int identity not null,
    name varchar(50)not null)
    go
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('cdefg')
    insert into dup(name) values ('xyz')
    insert into dup(name) values ('xyz')
    go
    select *
    from dup
    go
    create table tempdb..wk(id int not null, 
    name varchar(50)not null)
    go
    create unique index idx_remove_dup 
    on tempdb..wk(name)
    with IGNORE_DUP_KEY 
    go
    INSERT INTO tempdb..wk (id, name)
    select id, name
    from dup
    go
    select *
    from tempdb..wk
    go
    delete from dup
    go
    set identity_insert dup on
    INSERT INTO dup (id, name)
    select id, name
    from tempdb..wk
    go
    set identity_insert dup off
    go
    select *
    from dup
    go
    注:这里delete原表,再加入不重复的值。也可以通过join只delete原表中重复的值。
      

  3.   

    语句写漏了
    sql = "select 标题,公司名称 from content group by 标题,公司名称 having count(*)>1" 但是我运行这条sql后...得到结果不对!
      

  4.   

    我的例子:
    id     标题     公司名称   内容                联系方式
    1      离心泵   上海a     专卖离心泵          021-0000
    2      排污泵   江苏b     专卖排污泵          000-0000
    3      离心泵   北京c     专卖离心泵          010-0000
    4      化工泵   江苏b     卖化工泵            000-0000
    5      离心泵   上海a     主要卖离心泵        021-0000从上面可以看到id 1 和5的  标题一样.公司名称也一样,我就想判断这两条就是重复的信息,查询出来,然后删除一条,不管内容和联系方式的条件!
    求助!!!!!