SQL根據B表內容修改A表內容,查詢表中重復記錄,刪除掉重復項只保留一條


以下sql是a,b兩張表通過關聯條件id修改a表值,如果b表有重復數據記錄,選第一條更新,紅色條件為附加限制條件,具體視情況而定;

UPDATE a SET
name = b.fname,
pwd = b.lname
FROM b
WHERE a.id = b.id
AND a.id in (2,3)   

以下sql為查詢單表中重復記錄;

select * from b t1 where t1.fname in  (select t2.fname from b t2 group by t2.fname having count(*) > 1)

以下為轉載SQL語句,刪除掉重復項只保留一條,提示(如果表沒有主鍵,導致ID重復,可利用rownum來做判斷保留min(rownum)),下邊也有函數處理方法

在幾千條記錄里,存在着些相同的記錄,如何能用SQL語句,刪除掉重復的呢
1、查找表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷 
select * from people 
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 

2、刪除表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷,只留有rowid最小的記錄 
delete from people 
where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1) 
and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1) 

3、查找表中多余的重復記錄(多個字段) 
select * from vitae a 
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 

4、刪除表中多余的重復記錄(多個字段),只留有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、查找表中多余的重復記錄(多個字段),不包含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)   

6.消除一個字段的左邊的第一位:

update tableName set [Title]=Right([Title],(len([Title])-1)) where Title like '村%'

7.消除一個字段的右邊的第一位:

update tableName set [Title]=left([Title],(len([Title])-1)) where Title like '%村'

8.假刪除表中多余的重復記錄(多個字段),不包含rowid最小的記錄 
update vitae set ispass=-1
where peopleId in (select peopleId from vitae group by peopleId

postgresql 刪除ID重復數據

原來表設計沒有主鍵導致SQL重復執行時會產生多條一模一樣的主鍵,現在需要對原來的表建立主鍵,需要對ID重復的數據進行刪除,只保留一條雖然數據完全一致,但好在pgsql數據庫提供了ctid的隱藏列,根據此列可以把只保留最小ctid的相同數據行。於是寫了以下存儲過程來處理。方便多了。再也不錯這種問題了。

CREATE OR REPLACE FUNCTION delete_repeat(tablename varchar)
RETURNS bigint AS
$BODY$
DECLARE
rec RECORD;
sql varchar;
BEGIN
RAISE INFO '處理表名:%', tablename;
IF NOT exists(select * from pg_class where relname = tablename) then
RAISE INFO '處理表不存在:%', tablename;
RETURN -1;
END IF;

FOR rec in EXECUTE('select id from '||tablename||' group by id having count(id) > 1') LOOP
RAISE INFO 'id:%', rec.id;
sql := 'delete from ' || tablename || ' where id = ''' || rec.id|| ''' and
ctid <> (select min(ctid) from ' || tablename || ' where id = ''' || rec.id|| ''')';
execute sql;
RAISE INFO 'sql:%', sql;
END LOOP;
RETURN 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

運行select delete_repeat('tablename'); 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM