日期:2014-05-18  浏览次数:20595 次

求一条Sql语句,望各位大侠解惑
有用户表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个表为例写一示例或给一些建议,菜鸟小弟再次万分感谢!!

------解决方案--------------------
--查询
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)
------解决方案--------------------
用sql保留数据,治标不治本,如果你的表继续写入数据,还是会有错误数据,保证数据唯一性,从表,程序上都可以下手。
------解决方案--------------------
探讨

--查询
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 User……

------解决方案--------------------
探讨
--查询
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 UserI……