请教一个sql分组查询的语句!
userid字段有很多重复的数据,想求一句sql只查询出该字段中重复的数据。谢谢!
例如:
userid
1
1
2
3
4
4
5
我查询的结果只求显示出
userid
1
1
4
4
这样的信息,不重复的通通不显示。
问题点数:50、回复次数:16Top
1 楼hxg5588(狂学ASP.net)回复于 2005-08-02 18:24:24 得分 0
另外还想在这句语句上能够删除重复的信息,只留一条,以达到userid字段不重复!Top
2 楼aw511(点点星灯)回复于 2005-08-02 18:25:45 得分 0
--参考
--选择表中字段值相同的记录,过滤不同的记录
declare @User table(Cid int,Cname varchar(50))
insert @User(Cid,Cname)
values (1,'企业合同工以上')
insert @User(Cid,Cname)
values (2,'编外工')
insert @User(Cid,Cname)
values (3,'实习生')
insert @User(Cid,Cname)
values (4,'临时工')
insert @User(Cid,Cname)
values (5,'编外工')
select * from @User
select * from @User A
where Exists (select 1 from @user where Cname=A.Cname having count(*)>1)
select a.* from @User as a,(
select Cname from @User group by Cname
having count(*) >1
) as b
where a.Cname=b.Cname
order by a.CnameTop
3 楼vivianfdlpw()回复于 2005-08-02 18:27:59 得分 0
select * from 表 t
where
(
select count(1) from 表
where userid=t.userid
)>1Top
4 楼aw511(点点星灯)回复于 2005-08-02 18:30:31 得分 0
declare @t table(userid int)
insert @t values(1)
insert @t values(1)
insert @t values(2)
insert @t values(3)
insert @t values(4)
insert @t values(4)
insert @t values(5)
select * from @t A
where Exists (select 1 from @t where userid=A.userid having count(*)>1)
select a.* from @t as a,(
select userid from @t group by userid
having count(*) >1
) as b
where a.userid=b.userid
order by a.userid
--两种方法Top
5 楼aw511(点点星灯)回复于 2005-08-02 18:32:08 得分 0
删除重复数据
一、具有主键的情况
a.具有唯一性的字段id(为唯一主键)
delect table
where id not in
(
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,
那么只要col1字段内容相同即表示记录相同。
b.具有联合主键
假设col1+','+col2+','...col5 为联合主键
select * from table where col1+','+col2+','...col5 in (
select max(col1+','+col2+','...col5) from table
where having count(*)>1
group by col1,col2,col3,col4
)
group by 子句后跟的字段就是你用来判断重复的条件,
如只有col1,那么只要col1字段内容相同即表示记录相同。
or
select * from table where exists (select 1 from table x where table.col1 = x.col1 and
table.col2= x.col2 group by x.col1,x.col2 having count(*) >1)
c:判断所有的字段
select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa
二、没有主键的情况
a:用临时表实现
select identity(int,1,1) as id,* into #temp from ta
delect #temp
where id not in
(
select max(id) from # group by col1,col2,col3...
)
delete table ta
inset into ta(...)
select ..... from #temp
b:用改变表结构(加一个唯一字段)来实现
alter table 表 add newfield int identity(1,1)
delete 表
where newfield not in
(
select min(newfield) from 表 group by 除newfield外的所有字段
)
alter table 表 drop column newfield
Top
6 楼hxg5588(狂学ASP.net)回复于 2005-08-02 21:30:46 得分 0
有没有哪为大虾写得稍微易懂点啊?Top
7 楼aw511(点点星灯)回复于 2005-08-02 21:39:07 得分 0
上面写的你那里不懂啊!! 请标明,我跟你解释.
删除数据给出了方法,但你没有具体的数据,我不好写.Top
8 楼hxg5588(狂学ASP.net)回复于 2005-08-02 21:45:46 得分 0
看到你回贴,太感谢了!
我数据库不是很熟悉。这样把,我写个表啊
userid username text
001 aaa 111
001 aaa 111
002 bbb 222
003 ccc 333
003 ccc 333
004 ddd 444
005 eee 555
005 eee 555
例如以上这个表啊,001、003、005这几行是重复的吧,我现在要过滤到重复的内容,过滤以后的表如下:
userid username text
001 aaa 111
002 bbb 222
003 ccc 333
004 ddd 444
005 eee 555
谢谢啊!点点星灯老大:)Top
9 楼vivianfdlpw()回复于 2005-08-02 21:53:11 得分 0
select distinct * from 表Top
10 楼hxg5588(狂学ASP.net)回复于 2005-08-02 21:55:28 得分 0
不啊,这样只是选择出这些数据,但是我要彻底的删除重复的数据,让我的表中没有重复数据!~Top
11 楼lisiyong(小样)回复于 2005-08-02 23:01:04 得分 0
create table t#(userid varchar(10),uername varchar(10),text varchar(10))
insert into t#(userid ,uername ,text )
values('001','aaa','111')
insert t#(userid ,uername ,text )
values('001','aaa','111')
insert t#(userid ,uername ,text )
values('002','bbb','222')
insert t#(userid ,uername ,text )
values('003','ccc','333')
insert t#(userid ,uername ,text )
values('003','ccc','333')
insert t#(userid ,uername ,text )
values('005','eee','555')
insert t#(userid ,uername ,text )
values('005','eee','555')
delete from t# where NOT EXISTS (select distinct * from t# )
select * from t#
Top
12 楼gimy007(逮猫的耗子)回复于 2005-08-03 08:17:36 得分 0
select * from t where userid in(select userid from t group by userid having count(userid)>1)Top
13 楼aw511(点点星灯)回复于 2005-08-03 19:51:53 得分 0
--创建测试数据
CREATE TABLE [tttt] (
[userid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[username] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[text] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
insert tttt values('001','aaa','111')
insert tttt values('001','aaa','111')
insert tttt values('002','bbb','222')
insert tttt values('003','ccc','333')
insert tttt values('003','ccc','333')
insert tttt values('004','ddd','444')
insert tttt values('005','eee','555')
insert tttt values('005','eee','555')
--查看
select * from tttt
--要删除重复的数据,加了一个自动增长列
select identity(int,1,1) as id,* into #temp from tttt
--select * from #temp
delete from #temp
where id not in
(
select max(id) from #temp group by userid,username
)
--select * from #temp
---过滤好了所有的数据,开始删除原来的数据,导入新的数据
delete from tttt
insert tttt
select Userid,username,text from #temp
drop table #temp
--查看结果
select * from tttt
--删除表
drop table tttt
---如果你想知道怎么来的,就自己一步一步的查看Top
14 楼qxq321()回复于 2005-08-03 21:51:18 得分 0
这样的啊,直接使用临时表可以来完成的:
select * into a from tb
truncate tb
insert into tb select * from a
drop table a
Top
15 楼QQMagicer(在IT的路上越走越远)回复于 2005-08-04 11:19:41 得分 0
select userid,count(*)
from tttt
group by userid
having count(*)>1
--这个可以选出重复的行
delete from tttt
group by userid
having count(*)>1
--这个可以删除重复的行
Top
16 楼QQMagicer(在IT的路上越走越远)回复于 2005-08-04 11:30:51 得分 0
不好意思,借用一下 aw511(点点星灯) 的数据结构和数据,在修改一下结果
CREATE TABLE [tttt] (
[userid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[username] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[text] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
insert tttt values('001','aaa','111')
insert tttt values('001','aaa','111')
insert tttt values('002','bbb','222')
insert tttt values('003','ccc','333')
insert tttt values('003','ccc','333')
insert tttt values('004','ddd','444')
insert tttt values('005','eee','555')
insert tttt values('005','eee','555')
select * from tttt
select * from tttt
where userid in(
select userid
from tttt
group by userid
having count(*)>1)
查询结果--------
001 aaa 111
001 aaa 111
003 ccc 333
003 ccc 333
005 eee 555
005 eee 555
-----------
不知道是不是这样子的
如果要删除重复数据又要选择那些不重复的数据为什么不执行两步,反正也是要写一个存储过程
Top




