SELECT * from tab1 where CompanyName in ( SELECT companyname from tab1 GROUP BY CompanyName HAVING COUNT (*)>1);
-- 129.433ms
SELECT * from tab1 INNER join ( SELECT companyname from tab1 GROUP BY CompanyName HAVING COUNT (*)>1) as tab2 USING(CompanyName);
-- 0.482ms
方法二
有兩個意義上的重複記錄,一是完全重複的記錄,也即所有字段均重複的記錄,二是部分關鍵字段重複的記錄,比如 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)
常用的語句
1、查找表中多餘的重複記錄,重複記錄是根據單個字段(mail_id)來判斷
代碼如下 複製代碼
SELECT * FROM table WHERE mail_id IN ( SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT (mail_id) > 1);
2、刪除表中多餘的重複記錄,重複記錄是根據單個字段(mail_id)來判斷,只留有rowid最小的記錄
代碼如下 複製代碼
DELETE FROM table WHERE mail_id IN ( SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT (mail_id) > 1) AND rowid NOT IN ( SELECT MIN (rowid) FROM table GROUP BY mail_id HAVING COUNT (mail_id )>1);
3、查找表中多餘的重複記錄(多個字段)
代碼如下 複製代碼
SELECT * FROM table WHERE (mail_id,phone) IN ( SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT (*) > 1);
4、刪除表中多餘的重複記錄(多個字段),只留有rowid最小的記錄
代碼如下 複製代碼
DELETE FROM table WHERE (mail_id,phone) IN ( SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COU(www.jb51.net)NT(*) > 1) AND rowid NOT IN ( SELECT MIN (rowid) FROM table GROUP BY mail_id,phone HAVING COUNT (*)>1);
5、查找表中多餘的重複記錄(多個字段),不包含rowid最小的記錄
代碼如下 複製代碼
SELECT * FROM table WHERE (a.mail_id,a.phone) IN ( SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT (*) > 1) AND rowid NOT IN ( SELECT MIN (rowid) FROM table GROUP BY mail_id,phone 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
(一)單個字段
1、查找表中多餘的重複記錄,根據(question_title)字段來判斷
代碼如下 複製代碼
select * from questions where question_title in ( select question_title from people group by question_title having count (question_title) > 1)
2、刪除表中多餘的重複記錄,根據(question_title)字段來判斷,只留有一個記錄
代碼如下 複製代碼
delete from questions
where peopleId in ( select peopleId from people group by peopleId having count (question_title) > 1)
and min (id) not in ( select question_id from questions group by question_title having count (question_title)>1)
(二)多個字段
刪除表中多餘的重複記錄(多個字段),只留有rowid最小的記錄
代碼如下 複製代碼
DELETE FROM questions WHERE (questions_title,questions_scope) IN ( SELECT questions_title,questions_scope FROM que(www.jb51.net)stions GROUP BY questions_title,questions_scope HAVING COUNT (*) > 1) AND question_id NOT IN ( SELECT MIN (question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT (*)>1)
用上述語句無法刪除,創建了臨時表才刪的,求各位達人解釋一下。
代碼如下 複製代碼
CREATE TABLE tmp AS SELECT question_id FROM questions WHERE (questions_title,questions_scope) IN ( SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT (*) > 1) AND question_id NOT IN ( SELECT MIN (question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT (*)>1);
DELETE FROM questions WHERE question_id IN ( SELECT question_id FROM tmp);
DROP TABLE tmp;
|