mysql刪除重複記錄語句的方法

例如: 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是主鍵 要求獲得這樣的結果 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) from 表 group by name,value )b on a.id=b.id where b.id is null 查詢及刪除重複記錄的SQL語句 查詢及刪除重複記錄的SQL語句 一、查找表中多餘的重複記錄,重複記錄是根據單個字段(peopleId)來判斷 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 二、刪除表中多餘的重複記錄,重複記錄是根據單個字段(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) 三、查找表中多餘的重複記錄(多個字段) select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count() > 1) 四、刪除表中多餘的重複記錄(多個字段),只留有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) 五、查找表中多餘的重複記錄(多個字段),不包含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字段重複,而其餘字段不必定重複或都重複能夠忽略。   一、對於第一種重複,比較容易解決,使用 select distinct * from tableName   就能夠獲得無重複記錄的結果集。   若是該表須要刪除重複的記錄(重複記錄保留1條),能夠按如下方法刪除 select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp   發生這種重複的緣由是表設計不周產生的,增長惟一索引列便可解決。   二、這類重複問題一般要求保留重複記錄中的第一條記錄,操做方法以下   假設有重複的字段爲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 ) 學習sql有一段時間了,發如今我建了一個用來測試的表(沒有建索引)中出現了許多的重複記錄。後來總結了一些刪除重複記錄的方法,在Oracle中,能夠經過惟一rowid實現刪除重複記錄;還能夠建臨時表來實現...這個只提到其中的幾種簡單實用的方法,但願能夠和你們分享(以表employee爲例)。 SQL> desc employee Name Null? Typesql


emp_id NUMBER(10) emp_name VARCHAR2(20) salary NUMBER(10,2) 能夠經過下面的語句查詢重複的記錄: 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 SALARYide


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)經過創建臨時表來實現 SQL>create table temp_emp as (select distinct * from employee) SQL> truncate table employee; (清空employee表的數據) SQL> insert into employee select * from temp_emp; (再將臨時表裏的內容插回來) ( 2)經過惟一rowid實現刪除重複記錄.在Oracle中,每一條記錄都有一個rowid,rowid在整個數據庫中是惟一的,rowid肯定了每條記錄是在Oracle中的哪個數據文件、塊、行上。在重複的記錄中,可能全部列的內容都相同,但rowid不會相同,因此只要肯定出重複記錄中那些具備最大或最小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)也是經過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 SALARYfetch


1 sunshine 10000 3 xyz 30000 2 semon 20000 SQL> desc employee Name Null? Type.net


emp_id NUMBER(10) emp_name VARCHAR2(20) salary NUMBER(10,2) 能夠經過下面的語句查詢重複的記錄: 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 SALARYget


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)經過創建臨時表來實現 SQL>create table temp_emp as (select distinct * from employee) SQL> truncate table employee; (清空employee表的數據) SQL> insert into employee select * from temp_emp; (再將臨時表裏的內容插回來) ( 2)經過惟一rowid實現刪除重複記錄.在Oracle中,每一條記錄都有一個rowid,rowid在整個數據庫中是惟一的,rowid肯定了每條記錄是在Oracle中的哪個數據文件、塊、行上。在重複的記錄中,可能全部列的內容都相同,但rowid不會相同,因此只要肯定出重複記錄中那些具備最大或最小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)也是經過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

相關文章
相關標籤/搜索