4

多くの重複行があり、主キーがないテーブルがあります。
重複したレコードだけを削除したいのですが、これを実行しようとすると、すべてのピアが削除されます。

ROWIDPostgres のテーブルからを見つけるにはどうすればよいですか?

4

3 に答える 3

5

PostgreSQL では、行の物理的な場所は CTID と呼ばれます。

したがって、表示したい場合は、次のように QUERY を使用します。

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);
于 2013-02-22T14:28:47.533 に答える
5

これを 1 つのクエリ レベルで単純化します。

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

.. ここで、重複は の等価性によって定義され$other_columnsます。句の
列をリストに含める必要がないため、別のサブクエリは必要ありません。GROUP BYSELECT

ctid現在のマニュアルでは。

于 2013-02-22T15:19:50.057 に答える