Para saber si cualquiera existe un duplicado completo (idéntico en todas las columnas), esta es probablemente la forma más rápida:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid <> t1.ctid
)
NATURAL JOIN
es una abreviatura muy conveniente para el caso porque (citando el manual aquí
):
EXISTS
es probablemente el más rápido, porque Postgres deja de buscar tan pronto como se encuentra el primer duplicado. Dado que lo más probable es que no tenga un índice que cubra toda la fila y su tabla es enorme, esto le ahorrará mucho del tiempo.
Tenga en cuenta que NULL
es nunca considerado idéntico a otro NULL
. Si tiene NULL
valores y los considera idénticos, tendría que hacer más.
ctid
es una columna del sistema
que se puede (ab-)utilizar como clave principal ad-hoc, pero no puede reemplazar una clave principal definida por el usuario real a largo plazo.
La versión obsoleta 8.1 parece no tener <>
operador definido para un ctid
. Intenta transmitir a text
:
SELECT EXISTS (
SELECT 1
FROM tbl t
NATURAL JOIN tbl t1
WHERE t.ctid::text <> t1.ctid::text
)