多くの重複行があり、主キーがないテーブルがあります。
重複したレコードだけを削除したいのですが、これを実行しようとすると、すべてのピアが削除されます。
ROWID
Postgres のテーブルからを見つけるにはどうすればよいですか?
多くの重複行があり、主キーがないテーブルがあります。
重複したレコードだけを削除したいのですが、これを実行しようとすると、すべてのピアが削除されます。
ROWID
Postgres のテーブルからを見つけるにはどうすればよいですか?
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);
これを 1 つのクエリ レベルで単純化します。
DELETE FROM table_name
WHERE ctid NOT IN (
SELECT min(ctid)
FROM table_name
GROUP BY $other_columns);
.. ここで、重複は の等価性によって定義され$other_columns
ます。句の
列をリストに含める必要がないため、別のサブクエリは必要ありません。GROUP BY
SELECT