国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

oracle查詢重復數據和刪除重復記錄示例分享

2020-07-26 14:22:04
字體:
來源:轉載
供稿:網友

一、查詢某個字段重復

   select *     from User u     where u.user_name in (select u.user_name                  from User u                group by u.user_name  having count(*) > 1)

二,刪除表中某幾個字段的重復

例:表中有條六條記錄。   其中張三和王五   的記錄有重復
TableA

id customer PhoneNo 001 張三 777777 002 李四 444444 003 王五 555555 004 張三 777777 005 張三 777777 006 王五 555555 如何寫一個sql語句將TableA變成如下 001 張三 777777 002 李四 444444 003 王五 555555

測試環境

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'

結果

delete TableA from TableA Twhereexists( select 1fromtablea where customer=T.customer and phoneno=T.phoneno andid < tt.id)

總結

該方法適用于有一個字段為自增性,例如本例中的:id

delete 表名 from 表名 as Twhereexists( select 1from表名 where 字段A=T.字段A and 字段B=T.字段B,(....) and自增列 < T.自增列)

三,查詢并刪除重復記錄的SQL語句

查詢及刪除重復記錄的SQL語句

1、查找表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷

select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 

2、刪除表中多余的重復記錄,重復記錄是根據單個字段(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、查找表中多余的重復記錄(多個字段)

select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 

4、刪除表中多余的重復記錄(多個字段),只留有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、查找表中多余的重復記錄(多個字段),不包含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表中存在一個字段“name”,
而且不同記錄之間的“name”值有可能會相同,
現在就是需要查詢出在該表中的各記錄之間,“name”值存在重復的項;

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 方法二
"重復記錄"有兩個意義上的重復記錄,一是完全重復的記錄,也即所有字段均重復的記錄,二是部分關鍵字段重復的記錄,比如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子句中省去此列)

(四)
查詢重復

select * from tablename where id in ( select id from tablename group by id having count(id) > 1 )

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丰顺县| 江阴市| 东乡| 大洼县| 秦安县| 甘洛县| 新民市| 辰溪县| 阿巴嘎旗| 亚东县| 油尖旺区| 翼城县| 喀喇| 英德市| 太湖县| 梅河口市| 灵寿县| 镇康县| 师宗县| 齐齐哈尔市| 万荣县| 钦州市| 古交市| 松滋市| 工布江达县| 柳林县| 华容县| 论坛| 绥宁县| 秭归县| 嘉善县| 安庆市| 莲花县| 宜春市| 宁海县| 锡林浩特市| 富阳市| 宜川县| 大石桥市| 安岳县| 壶关县|