我有一個包含大量重複行並且沒有主鍵的表。
我想刪除重複的記錄,但是當我嘗試這樣做時,它會刪除所有對等項。如何在DELETE語句中使用行(ROWID)的物理位置
如何從Postgres中的表中找到ROWID
?
我有一個包含大量重複行並且沒有主鍵的表。
我想刪除重複的記錄,但是當我嘗試這樣做時,它會刪除所有對等項。如何在DELETE語句中使用行(ROWID)的物理位置
如何從Postgres中的表中找到ROWID
?
在PostgreSQL上,該行的物理位置稱爲CTID。
所以,如果你想查看它使用這樣的查詢:
SELECT CTID FROM table_name
要使用它DELETE語句刪除重複記錄使用這樣的:
DELETE FROM table_name WHERE CTID NOT IN (
SELECT RECID FROM
(SELECT MIN(CTID) AS RECID, other_columns
FROM table_name GROUP BY other_columns)
a);
記住table_name是所需的表,other_columns是您想要用來過濾的列。
即:
DELETE FROM user_department WHERE CTID NOT IN (
SELECT RECID FROM
(SELECT MIN(CTID) AS RECID, ud.user_id, ud.department_id
FROM user_department ud GROUP BY ud.user_id, ud.department_id)
a);
由一個查詢級別簡化此:
DELETE FROM table_name
WHERE ctid NOT IN (
SELECT min(ctid)
FROM table_name
GROUP BY $other_columns);
..其中重複通過平等$other_columns
定義。
不需要在SELECT
列表中包含來自GROUP BY
子句的列,因此您不需要其他子查詢。