有用户表N张,分布为[UserInfo_1],.......[UserInfo_N],表结构相同如下:
USE [test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserInfo](
[GroupId] [int] NOT NULL,
[UserId] [int] NOT NULL,
[UserName] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Reserved1] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[Reserved4] [nvarchar](max) COLLATE Chinese_PRC_CI_AS NULL,
[CreateDate] [datetime] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
其中在同一张表中UserId与UserName都是对应的;同一表同一GroupId不会出现相同UserId,但在不同表中前一条的不成立,即不同表相同UserName的UserId不同,这样就出现了相同GroupId在不同表出现了相同UserName。表的设计问题在此不讨论,应为这已经不是我能改变的了。当然可以给给意见。
[UserInfo_1]
GroupId  UserId    UserName  .....
1         1         jack     .....  
1         2         sfs      .....
1         3         gf       .....
1         4         gfg
1         5         eert
1         6         asfd 
——————————————————————[UserInfo_2]
GroupId  UserId    UserName    .....
1         101         dgg      .....  
1         102         jack     .....
1         303         454      .....
1         104         dgd      .....
1         105         sdgg     .....
1         606         ertt     .....
 结果为不同表相同的GroupId下相同UserName的只留下一条,最好留下时间最晚的一个,各个表均为千万级或更高的。性能问题一定得考虑进去,请以2个表为例写一示例或给一些建议,菜鸟小弟再次万分感谢!!

解决方案 »

  1.   

    --查询
    select t.* from UserInfo_1 t where 时间 = (select max(时间) from UserInfo_1 where GroupId = t.GroupId and UserName = t.UserName)select t.* from UserInfo_1 t where not exists (select 1 from UserInfo_1 where GroupId = t.GroupId and UserName = t.UserName and 时间 > t.时间)--删除
    delete UserInfo_1 from UserInfo_1 t where 时间 not in (select max(时间) from UserInfo_1 where GroupId = t.GroupId and UserName = t.UserName)
      

  2.   

    用sql保留数据,治标不治本,如果你的表继续写入数据,还是会有错误数据,保证数据唯一性,从表,程序上都可以下手。
      

  3.   

    感谢你的回答,在同一个UserInfo表里面的一个GroupId不会出现相同的UserID也就是不会出现相同的UserName,这位仁兄应该理解错误了,我要删除的是不同表中相同GroupId并UserName也相同的数据留下一条。
      

  4.   

    兄弟你说的很对啊,但这是我接手别人的东西,已经不能进行大改了,并写入只有一次,也就是一个GroupId只是一个词操作的结果,后面的GroupId不会二次出现,我现在是想在写入之后把重复的删除,怎么说呢,其实不能算写入,是从其他表中Insert过滤的