| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 14657 人关注过本帖
标题:在一张表中怎样去掉某个字段得重复的数据?
只看楼主 加入收藏
lingchen
Rank: 1
等 级:禁止访问
帖 子:50
专家分:0
注 册:2006-5-7
结帖率:100%
收藏
 问题点数:0 回复次数:11 
在一张表中怎样去掉某个字段得重复的数据?
如题,,假如我的数据库里有一张表存的数据量很大,但是有很多是某一个字段数据重复的,怎样去掉这重复数据呢?
原表A:
K       KK         KKK      KKKKK
12       221       444        66565
54      6565       4896       655+
36       66        488       5464            
98        546+     444        +95+5
.......

上表中,在KKK列里是重复的,有两行数据,怎样可以把其中的一条去掉呢?只保留一条..变成如下表:
K       KK         KKK      KKKKK
54      6565       4896       655+
36       66        488       5464            
98        546+     444        +95+5
.......
假如表的数据量很大,但KKK列不可以有重复,,有重复的任意保留一条即可,请问各位这样的SQL语句怎样写呢?
搜索更多相关主题的帖子: 字段 数据 
2008-03-19 18:23
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
收藏
得分:0 
--按某一字段分组取最大(小)值所在行的数据
(爱新觉罗.毓华 2007-10-23于浙江杭州)
/*
数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('b',    1,   'b1--b的第一个值')
insert into tb values('b',    3,   'b3:b的第三个值')
insert into tb values('b',    2,   'b2b2b2b2')
insert into tb values('b',    4,   'b4b4')
insert into tb values('b',    5,   'b5b5b5b5b5')
go

--一、按name分组取val最大的值所在行的数据。
--方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
/*
name       val         memo                 
---------- ----------- --------------------
a          3           a3:a的第三个值
b          5           b5b5b5b5b5
*/

--二、按name分组取val最小的值所在行的数据。
--方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
/*
name       val         memo                 
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值
*/

--三、按name分组取第一次出现的行所在的数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
/*
name       val         memo                 
---------- ----------- --------------------
a          2           a2(a的第二个值)
b          1           b1--b的第一个值
*/

--四、按name分组随机取一条数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
/*
name       val         memo                 
---------- ----------- --------------------
a          1           a1--a的第一个值
b          5           b5b5b5b5b5
*/

--五、按name分组取最小的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name
/*
name       val         memo                 
---------- ----------- --------------------
a          1           a1--a的第一个值
a          2           a2(a的第二个值)
b          1           b1--b的第一个值
b          2           b2b2b2b2
*/

--六、按name分组取最大的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name
/*
name       val         memo                 
---------- ----------- --------------------
a          2           a2(a的第二个值)
a          3           a3:a的第三个值
b          4           b4b4
b          5           b5b5b5b5b5
*/
--七,如果整行数据有重复,所有的列都相同。
/*
数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    1   a1--a的第一个值
a    3   a3:a的第三个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5
*/
--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('b',    1,   'b1--b的第一个值')
insert into tb values('b',    3,   'b3:b的第三个值')
insert into tb values('b',    2,   'b2b2b2b2')
insert into tb values('b',    4,   'b4b4')
insert into tb values('b',    5,   'b5b5b5b5b5')
go

select * , px = identity(int,1,1) into tmp from tb

select m.name,m.val,m.memo from
(
  select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) m where px = (select min(px) from
(
  select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) n where n.name = m.name)

drop table tb,tmp

/*
name       val         memo
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值

(2 行受影响)
*/
--在sql server 2005中可以使用row_number函数,不需要使用临时表。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    1,   'a1--a的第一个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('a',    3,   'a3:a的第三个值')
insert into tb values('b',    1,   'b1--b的第一个值')
insert into tb values('b',    3,   'b3:b的第三个值')
insert into tb values('b',    2,   'b2b2b2b2')
insert into tb values('b',    4,   'b4b4')
insert into tb values('b',    5,   'b5b5b5b5b5')
go

select m.name,m.val,m.memo from
(
  select * , px = row_number() over(order by name , val) from tb
) m where px = (select min(px) from
(
  select * , px = row_number() over(order by name , val) from tb
) n where n.name = m.name)

drop table tb

/*
name       val         memo
---------- ----------- --------------------
a          1           a1--a的第一个值
b          1           b1--b的第一个值

(2 行受影响)
*/

我的msn: myfend@
2008-03-19 18:24
lingchen
Rank: 1
等 级:禁止访问
帖 子:50
专家分:0
注 册:2006-5-7
收藏
得分:0 
不懂,,,,怎么看起来很复杂的,,?
2008-03-19 19:01
qboy9867
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-11-4
收藏
得分:0 
select distinct(kkk) from A

Distinct 返回一个集合,并从指定集合中删除重复的元组。从尾部删除重复的元组。

2008-03-21 11:25
luyihuaa5201
Rank: 2
等 级:论坛游民
帖 子:254
专家分:10
注 册:2007-3-25
收藏
得分:0 
2楼的用的是什么方法呀??  看的不明白~~   4楼 我就觉得方法蛮好的 ,以前老师也是这么说的.
2008-03-21 12:16
jalonlovesja
Rank: 5Rank: 5
来 自:湖南邵阳
等 级:职业侠客
帖 子:292
专家分:371
注 册:2008-2-19
收藏
得分:0 
认为2楼的方法很好了,用这个distinct关键字的话,假如我要得到这个值ID的,而已这个值是重复了,请问4楼的该怎么做啊??
2008-03-21 15:52
lingchen
Rank: 1
等 级:禁止访问
帖 子:50
专家分:0
注 册:2006-5-7
收藏
得分:0 
谢谢各位的回答!看起来2楼的可以,但是可惜的是我看不懂........
4楼的方法只不过是去掉某一列的重复数据,但是我的目的是去掉这一列的重复数据后,剩下来的数据要全部显示出来,也就是说整张表的所有值都要出来,这样的话不知道怎样做才可以实现?
2008-03-21 18:24
yuwenxiang
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2008-3-24
收藏
得分:0 
连我也看不懂,郁闷
2008-03-26 19:17
jalonlovesja
Rank: 5Rank: 5
来 自:湖南邵阳
等 级:职业侠客
帖 子:292
专家分:371
注 册:2008-2-19
收藏
得分:0 
举个例子,比如数据库中有如下数据   
  a1           a2           a3           a4           a5   
  1             a             aaa         a             a   
  2             b             bbb         b             b   
  3             c             aaa         c             c   
  4             d             bbb         d             d   
  5             e             eee         e             e   
  6             f             ddd         f             f   
  7             g             bbb         g             g   
  8             h             eee         h             h   
  9             i             eee         i             i   
  10           j             aaa         j             j   
  如何用一条语句取得这样记录集,去掉a3中重复的字段,取a1是最小的,如下   
  a1           a2           a3           a4           a5   
  1             a             aaa         a             a   
  2             b             bbb         b             b   
  5             e             eee         e             e   
  6             f             ddd         f             f


  SELECT   *   FROM   aaa   WHERE   a1   IN(SELECT   MIN(a1)   FROM   aaa   GROUP   BY   a3)
2008-03-27 09:32
shezhenhui1989
Rank: 1
来 自:安徽
等 级:新手上路
帖 子:287
专家分:0
注 册:2008-2-1
收藏
得分:0 
用distinct关键字,可以消除同一列重复的数据
2008-03-27 15:02
快速回复:在一张表中怎样去掉某个字段得重复的数据?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013337 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved