求一sql语句,怎么来除掉重复记录.小弟先过大家
各位高手:
我有:"select 序号,日期,用量 from abc where 序号=1" 语句/
现在我改为:"select 序号,distinct 日期,用量 from abc where 表号=1"
为什么不对???
我的目的只是实现:在一天中只查询出一条记录,将一天中多余重复记录去掉,这样怎么实现???请大家帮帮我,小弟先谢过大家.
问题点数:0、回复次数:11Top
1 楼yesyesyes()回复于 2004-12-03 07:58:32 得分 0
同一天如果有相同的用量怎么处理呢?因为你还有序号.Top
2 楼jingxijun(一笑)回复于 2004-12-03 08:05:00 得分 0
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)Top
3 楼jingxijun(一笑)回复于 2004-12-03 08:09:09 得分 0
select identity(int,1,1) as autoID, * into #t1 from abc
select min(autoID) as autoID into #t2 from #t1 group by 日期
select * from #t1 where autoID in (select autoID from #t2)Top
4 楼zzy928()回复于 2004-12-03 08:16:48 得分 0
你所指的表号 = 1
是指表号是你要查询的表中的一个列
还是指你要查询的是表号1呢?
对不起
有点看不懂Top
5 楼yingqing(曾明)回复于 2004-12-03 08:34:48 得分 0
語法有問題,distinct不能夠放在字段中間和字段後面,呵呵Top
6 楼goodboycwy(霸王别姬)回复于 2004-12-03 08:41:24 得分 0
这是从蚂蚁那里学过来的:
去除重复值
如果有ID字段,就是具有唯一性的字段
delect table where id not in (
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。
2,如果是判断所有字段也可以这样
select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa
3,没有ID的情况
select identity(int,1,1) as id,* into #temp from tabel
delect # where id not in (
select max(id) from # group by col1,col2,col3...)
delect table
inset into table(...)
select ..... from #temp
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字段内容相同即表示记录相同。
2,
select identity(int,1,1) as id,* into #temp from tabel
select * from #temp where id in (
select max(id) from #emp where having count(*)>1 group by col1,col2,col3...)
删除重复的,只留一条:
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
select distinct * into #temp from 表
truncate table 表
insert 表 select * from #temp
drop table #temp
Top
7 楼szsmall(麒麟)回复于 2004-12-03 08:52:44 得分 0
select distinct 日期 from abc where 表号=1Top
8 楼chenxiaoguo20(chenxiaoguo20)回复于 2004-12-03 09:18:40 得分 0
更正,那"表号"就是"序号"我写错了.Top
9 楼chenxiaoguo20(chenxiaoguo20)回复于 2004-12-03 10:15:01 得分 0
各位高手,我是在程序里用到sql语句:
现在用;select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
程序中怎么才能用到一条语句来实现???
也就是说我只能用一知语句来完成.可以上是三条语句,怎样才可以压到一条语句中???请各位指点.
Top
10 楼zling1981(struts+spring_hibernate!!☆☆☆☆☆)回复于 2004-12-03 10:18:51 得分 0
新增一个标识列,利用它来删除重复纪录:
ALTER TABLE T1
ADD key_col INT NOT null IDENTITY
DELETE FROM T1
WHERE EXISTS
(
SELETE *
FROM T1 AS T2
WHERE T2.C1=T1.C1 AND T2.C2=T1.C2
AND T2.key_col> t1.key_col
ALTER TABLE T1
DROP column key_col
Top
11 楼long0104()回复于 2004-12-03 10:26:33 得分 0
如果有ID字段,就是具有唯一性的字段
delect table where id not in (
select max(id) from table group by col1,col2,col3...
)
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。
2,如果是判断所有字段也可以这样
select * into #aa from table group by id1,id2,....
delete table
insert into table
select * from #aa
3,没有ID的情况
select identity(int,1,1) as id,* into #temp from tabel
delect # where id not in (
select max(id) from # group by col1,col2,col3...)
delect table
inset into table(...)
select ..... from #temp
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字段内容相同即表示记录相同。
2,
select identity(int,1,1) as id,* into #temp from tabel
select * from #temp where id in (
select max(id) from #emp where having count(*)>1 group by col1,col2,col3...)
删除重复的,只留一条:
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
select distinct * into #temp from 表
truncate table 表
insert 表 select * from #temp
drop table #temp
Top




