¿Alguien sabe cómo realizar dicha consulta en Postgresql?cláusula NOT EXISTS en Postgresql
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB
WHERE tabB.id = tabA.id
)
Cuando ejecuto dicha consulta, PostgreSQL se queja "ERROR: Greenplum Database does not yet support that query
."
EDIT: ¿Y qué tal ésta:
SELECT *
FROM tabA
WHERE NOT EXISTS (
SELECT *
FROM tabB WHERE tabB.id = tabA.id AND tabB.id2 = tabA.id2
)
EDIT:
Probé en PostgreSQL 8.2.15 para los 4 respuestas proporcionadas por @ypercube. Las conclusiones son:
1) El primero no funciona en esta versión de postgresql, como dije antes en la pregunta. El mensaje de error se puede encontrar allí también.
2) Para las otras tres respuestas, la velocidad de ejecución es: (3) UNIÓN IZQUIERDA> (4) EXCEPTO >> (2) NO EN.
Específicamente, para consultas que tienen la misma sintaxis, (3) LEFT JOIN toma aproximadamente 5580ms, (4) EXCEPTO toma aproximadamente 13502ms, y (2) NOT IN toma más de 100000 (De hecho, no esperé hasta que terminó).
¿Hay alguna razón particular para que la cláusula NOT IN sea tan lenta?
Cheng
PostgreSQL 8.2 es antiguo y ya no es compatible. Hubo cambios importantes en cómo las consultas 'EXISTS' y' NOT EXISTS' funcionan desde entonces. http://www.postgresql.org/support/versioning/ – kgrittn
Si desea encontrar las consultas más eficientes, creo que primero debe verificar los índices que tiene en las tablas.No mencionas el tamaño de las tablas, pero 5 segundos para una consulta significa (99%) tablas enormes o falta de índices. Le sugiero que agregue una nueva pregunta, incluidas las definiciones ('CREATE TABLE') de las dos tablas, las consultas y los planes de ejecución. –