以下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語句,刪除掉重復的呢 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最小的記錄 |
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');