一、查詢某個(gè)字段重復(fù)
select *
from User u
where u.user_name in (select u.user_name
from User u
group by u.user_name having count(*) > 1)
二,刪除表中某幾個(gè)字段的重復(fù)
例:表中有條六條記錄。 其中張三和王五 的記錄有重復(fù)
TableA
id customer PhoneNo
001 張三 777777
002 李四 444444
003 王五 555555
004 張三 777777
005 張三 777777
006 王五 555555
如何寫一個(gè)sql語句將TableA變成如下
001 張三 777777
002 李四 444444
003 王五 555555
測(cè)試環(huán)境
create table TableA ( id varchar(3),customer varchar(5),PhoneNo varchar(6))
insert into TableA select '001','張三','777777'
union all select '002','李四','444444'
union all select '003','王五','555555'
union all select '004','張三','777777'
union all select '005','張三','777777'
union all select '006','王五','555555'
結(jié)果
delete TableA from TableA Twhere
exists(
select 1fromtablea where customer=T.customer and phoneno=T.phoneno
andid tt.id
)
總結(jié)
該方法適用于有一個(gè)字段為自增性,例如本例中的:id
delete 表名 from 表名 as Twhere
exists(
select 1from表名 where 字段A=T.字段A and 字段B=T.字段B,(....)
and自增列 T.自增列
)
三,查詢并刪除重復(fù)記錄的SQL語句
查詢及刪除重復(fù)記錄的SQL語句
1、查找表中多余的重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來判斷
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
2、刪除表中多余的重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來判斷,只留有rowid最小的記錄
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
注:rowid為oracle自帶不用該.....
3、查找表中多余的重復(fù)記錄(多個(gè)字段)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
4、刪除表中多余的重復(fù)記錄(多個(gè)字段),只留有rowid最小的記錄
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
5、查找表中多余的重復(fù)記錄(多個(gè)字段),不包含rowid最小的記錄
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
(二)
比方說
在A表中存在一個(gè)字段“name”,
而且不同記錄之間的“name”值有可能會(huì)相同,
現(xiàn)在就是需要查詢出在該表中的各記錄之間,“name”值存在重復(fù)的項(xiàng);
Select Name,Count(*) From A Group By Name Having Count(*) > 1
如果還查性別也相同大則如下:
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1
(三)
方法一
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0 方法二
"重復(fù)記錄"有兩個(gè)意義上的重復(fù)記錄,一是完全重復(fù)的記錄,也即所有字段均重復(fù)的記錄,二是部分關(guān)鍵字段重復(fù)的記錄,比如Name字段重復(fù),而其他字段不一定重復(fù)或都重復(fù)可以忽略。
1、對(duì)于第一種重復(fù),比較容易解決,使用
select distinct * from tableName
就可以得到無重復(fù)記錄的結(jié)果集。
如果該表需要?jiǎng)h除重復(fù)的記錄(重復(fù)記錄保留1條),可以按以下方法刪除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
發(fā)生這種重復(fù)的原因是表設(shè)計(jì)不周產(chǎn)生的,增加唯一索引列即可解決。
2、這類重復(fù)問題通常要求保留重復(fù)記錄中的第一條記錄,操作方法如下
假設(shè)有重復(fù)的字段為Name,Address,要求得到這兩個(gè)字段唯一的結(jié)果集
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)
最后一個(gè)select即得到了Name,Address不重復(fù)的結(jié)果集(但多了一個(gè)autoID字段,實(shí)際寫時(shí)可以寫在select子句中省去此列)
(四)
查詢重復(fù)
select * from tablename where id in (
select id from tablename
group by id
having count(id) > 1
)
您可能感興趣的文章:- oracle數(shù)據(jù)庫的刪除方法詳解
- Oracle刪除數(shù)據(jù)報(bào)ORA 02292錯(cuò)誤的巧妙解決方法
- oracle 數(shù)據(jù)按主鍵刪除慢問題的解決方法
- Oracle刪除重復(fù)的數(shù)據(jù),Oracle數(shù)據(jù)去重復(fù)
- Oracle數(shù)據(jù)庫中的級(jí)聯(lián)查詢、級(jí)聯(lián)刪除、級(jí)聯(lián)更新操作教程
- Oracle誤刪除表數(shù)據(jù)后的數(shù)據(jù)恢復(fù)詳解
- 徹底刪除Oracle數(shù)據(jù)庫的方法
- oracle數(shù)據(jù)庫添加或刪除一列的sql語句
- oracle 批量刪除表數(shù)據(jù)的幾種方法