IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)Oracle → Oracle查詢并刪除重復(fù)記錄的SQL語(yǔ)句

Oracle查詢并刪除重復(fù)記錄的SQL語(yǔ)句

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

  查詢并刪除重復(fù)記錄的SQL語(yǔ)句

  查詢及刪除重復(fù)記錄的SQL語(yǔ)句

  1、查找表中多余的重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來(lái)判斷

  select * from people

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

  2、刪除表中多余的重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來(lái)判斷,只留有 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)

  (二)

  比方說(shuō)

  在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

  就可以得到無(wú)重復(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ù)問(wèn)題通常要求保留重復(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

  )

關(guān)鍵詞標(biāo)簽:Oracle,SQL語(yǔ)句

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 誤刪Oracle數(shù)據(jù)庫(kù)實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索 為UNIX服務(wù)器設(shè)置Oracle全文檢索

相關(guān)下載

    人氣排行 oracle中使用SQL語(yǔ)句修改字段類型-oracle修改SQL語(yǔ)句案例 Oracle中使用alter table來(lái)增加,刪除,修改列的語(yǔ)法 ORACLE SQL 判斷字符串是否為數(shù)字的語(yǔ)句 ORACLE和SQL語(yǔ)法區(qū)別歸納(1) oracle grant 授權(quán)語(yǔ)句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法