SQL Server 刪除重復(fù)記錄的幾種方法
來(lái)源:易賢網(wǎng) 閱讀:996 次 日期:2014-09-17 15:49:40
溫馨提示:易賢網(wǎng)小編為您整理了“SQL Server 刪除重復(fù)記錄的幾種方法”,方便廣大網(wǎng)友查閱!

例如:

id name value

1 a pp

2 a pp

3 b iii

4 b pp

5 b pp

6 c pp

7 c pp

8 c iii

id是主鍵

要求得到這樣的結(jié)果

id name value

1 a pp

3 b iii

4 b pp

6 c pp

8 c iii

方法1

delete YourTable

where [id] not in (

select max([id]) from YourTable

group by (name + value))

方法2

delete a

from 表 a left join(

select id=min(id) from 表 group by name,value

)b on a.id=b.id

where b.id is null

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

查詢(xún)及刪除重復(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)

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)在就是需要查詢(xú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、這類(lèi)重復(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í)際寫(xiě)時(shí)可以寫(xiě)在select子句中省去此列)

(四)

查詢(xún)重復(fù)

select * from tablename where id in (

select id from tablename

group by id

having count(id) > 1

)

學(xué)習(xí)sql有一段時(shí)間了,發(fā)現(xiàn)在我建了一個(gè)用來(lái)測(cè)試的表(沒(méi)有建索引)中出現(xiàn)了許多的重復(fù)記錄。后來(lái)總結(jié)了一些刪除重復(fù)記錄的方法,在Oracle中,可以通過(guò)唯一rowid實(shí)現(xiàn)刪除重復(fù)記錄;還可以建臨時(shí)表來(lái)實(shí)現(xiàn)...這個(gè)只提到其中的幾種簡(jiǎn)單實(shí)用的方法,希望可以和大家分享(以表employee為例)。

SQL> desc employee

Name Null? Type

----------------------------------------- -------- ------------------

emp_id NUMBER(10)

emp_name VARCHAR2(20)

salary NUMBER(10,2)

可以通過(guò)下面的語(yǔ)句查詢(xún)重復(fù)的記錄:

SQL> select * from employee;

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

1 sunshine 10000

2 semon 20000

2 semon 20000

3 xyz 30000

2 semon 20000

SQL> select distinct * from employee;

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

2 semon 20000

3 xyz 30000

SQL> select * from employee group by emp_id,emp_name,salary having count (*)>1

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

2 semon 20000

SQL> select * from employee e1

where rowid in (select max(rowid) from employe e2

where e1.emp_id=e2.emp_id and

e1.emp_name=e2.emp_name and e1.salary=e2.salary);

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

3 xyz 30000

2 semon 20000

2. 刪除的幾種方法:

(1)通過(guò)建立臨時(shí)表來(lái)實(shí)現(xiàn)

SQL>create table temp_emp as (select distinct * from employee)

SQL> truncate table employee; (清空employee表的數(shù)據(jù))

SQL> insert into employee select * from temp_emp; (再將臨時(shí)表里的內(nèi)容插回來(lái))

( 2)通過(guò)唯一rowid實(shí)現(xiàn)刪除重復(fù)記錄.在Oracle中,每一條記錄都有一個(gè)rowid,rowid在整個(gè)數(shù)據(jù)庫(kù)中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個(gè)數(shù)據(jù)文件、塊、行上。在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同,所以只要確定出重復(fù)記錄中那些具有最大或最小rowid的就可以了,其余全部刪除。

SQL>delete from employee e2 where rowid not in (

select max(e1.rowid) from employee e1 where

e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--這里用min(rowid)也可以。

SQL>delete from employee e2 where rowid <(

select max(e1.rowid) from employee e1 where

e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

e1.salary=e2.salary);

(3)也是通過(guò)rowid,但效率更高。

SQL>delete from employee where rowid not in (

select max(t1.rowid) from employee t1 group by

t1.emp_id,t1.emp_name,t1.salary);--這里用min(rowid)也可以。

EMP_ID EMP_NAME SALARY

1 sunshine 10000

3 xyz 30000

2 semon 20000

SQL> desc employee

Name Null? Type

----------------------------------------- -------- ------------------

emp_id NUMBER(10)

emp_name VARCHAR2(20)

salary NUMBER(10,2)

可以通過(guò)下面的語(yǔ)句查詢(xún)重復(fù)的記錄:

SQL> select * from employee;

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

1 sunshine 10000

2 semon 20000

2 semon 20000

3 xyz 30000

2 semon 20000

SQL> select distinct * from employee;

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

2 semon 20000

3 xyz 30000

SQL> select * from employee group by emp_id,emp_name,salary having count (*)>1

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

2 semon 20000

SQL> select * from employee e1

where rowid in (select max(rowid) from employe e2

where e1.emp_id=e2.emp_id and

e1.emp_name=e2.emp_name and e1.salary=e2.salary);

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

3 xyz 30000

2 semon 20000

2. 刪除的幾種方法:

(1)通過(guò)建立臨時(shí)表來(lái)實(shí)現(xiàn)

SQL>create table temp_emp as (select distinct * from employee)

SQL> truncate table employee; (清空employee表的數(shù)據(jù))

SQL> insert into employee select * from temp_emp; (再將臨時(shí)表里的內(nèi)容插回來(lái))

( 2)通過(guò)唯一rowid實(shí)現(xiàn)刪除重復(fù)記錄.在Oracle中,每一條記錄都有一個(gè)rowid,rowid在整個(gè)數(shù)據(jù)庫(kù)中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個(gè)數(shù)據(jù)文件、塊、行上。在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同,所以只要確定出重復(fù)記錄中那些具有最大或最小rowid的就可以了,其余全部刪除。

SQL>delete from employee e2 where rowid not in (

select max(e1.rowid) from employee e1 where

e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and e1.salary=e2.salary);--這里用min(rowid)也可以。

SQL>delete from employee e2 where rowid <(

select max(e1.rowid) from employee e1 where

e1.emp_id=e2.emp_id and e1.emp_name=e2.emp_name and

e1.salary=e2.salary);

(3)也是通過(guò)rowid,但效率更高。

SQL>delete from employee where rowid not in (

select max(t1.rowid) from employee t1 group by

t1.emp_id,t1.emp_name,t1.salary);--這里用min(rowid)也可以。

EMP_ID EMP_NAME SALARY

---------- ---------------------------------------- ----------

1 sunshine 10000

3 xyz 30000

2 semon 20000

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看數(shù)據(jù)庫(kù)
易賢網(wǎng)手機(jī)網(wǎng)站地址:SQL Server 刪除重復(fù)記錄的幾種方法
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話(huà):0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)