2013-02-22 77 views

回答

3

在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); 
2

由一個查詢級別簡化此:

DELETE FROM table_name 
WHERE ctid NOT IN (
    SELECT min(ctid) 
    FROM table_name 
    GROUP BY $other_columns); 

..其中重複通過平等$other_columns定義。
不需要在SELECT列表中包含來自GROUP BY子句的列,因此您不需要其他子查詢。

ctid in the current manual.