SQL面試常見問題:查詢及刪除重複記錄的方法

處理方式一:利用ROWCOUNT關鍵字
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
關於ROWCOUNT:①對於ROWCOUNT的設置是與Session有關的。如果佔用了一個Session,那麼對應的這個Session將使用最近一次設置的ROWCOUNT,直到Session結束或者修改了ROWCOUNT。②取消ROWCOUNT用SET ROWCOUNT 0 即可。③ROWCOUNT是返回受上一語句影響的行數。

處理方式二:
"重複記錄"有兩個意義上的重複記錄,一是完全重複的記錄,也即所有字段均重複的記錄,二是部分關鍵字段重複的記錄,比如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、這類重複問題通常要求保留重複記錄中的第一條記錄,操作方法如下
對查找表中多餘的重複記錄的處理:
Select * From 表 Where 重複字段 In (Select 重複字段 From 表 Group By 重複字段 Having Count(*)>1)
對刪除表中多餘的重複記錄,只留有rowid最小的記錄的處理:
delete from 表 where 重複字段 in (select 重複字段 from people group by 重複字段   having count(*) > 1)
and rowid not in (select min(rowid) from people group by 重複字段 having count(*)>1)
對查找表中多餘的重複記錄,不包含rowid最小的記錄的處理:
select * from 表 where 重複字段 in (select 重複字段 from vitae group by 重複字段 having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by 重複字段 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章