注册 登录
编程论坛 SQL Server论坛

在一张表中怎样去掉某个字段得重复的数据?

lingchen 发布于 2008-03-19 18:23, 14659 次点击
如题,,假如我的数据库里有一张表存的数据量很大,但是有很多是某一个字段数据重复的,怎样去掉这重复数据呢?
原表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语句怎样写呢?
11 回复
#2
purana2008-03-19 18:24
--按某一字段分组取最大(小)值所在行的数据
(爱新觉罗.毓华 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 行受影响)
*/
#3
lingchen2008-03-19 19:01
不懂,,,,怎么看起来很复杂的,,?
#4
qboy98672008-03-21 11:25
select distinct(kkk) from A

Distinct 返回一个集合,并从指定集合中删除重复的元组。从尾部删除重复的元组。
#5
luyihuaa52012008-03-21 12:16
2楼的用的是什么方法呀??  看的不明白~~   4楼 我就觉得方法蛮好的 ,以前老师也是这么说的.
#6
jalonlovesja2008-03-21 15:52
认为2楼的方法很好了,用这个distinct关键字的话,假如我要得到这个值ID的,而已这个值是重复了,请问4楼的该怎么做啊??
#7
lingchen2008-03-21 18:24
谢谢各位的回答!看起来2楼的可以,但是可惜的是我看不懂........
4楼的方法只不过是去掉某一列的重复数据,但是我的目的是去掉这一列的重复数据后,剩下来的数据要全部显示出来,也就是说整张表的所有值都要出来,这样的话不知道怎样做才可以实现?
#8
yuwenxiang2008-03-26 19:17
连我也看不懂,郁闷
#9
jalonlovesja2008-03-27 09:32
举个例子,比如数据库中有如下数据   
  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)
#10
shezhenhui19892008-03-27 15:02
用distinct关键字,可以消除同一列重复的数据
#11
liuning2008-03-30 11:57
你是要去掉一个表中完全重复的记录吗 ?
#12
comtestcom2017-02-06 14:44
回复 9楼 jalonlovesja
2017年我用了你这个语句。
1