Tengo dos tablas en una base de datos PostgreSQL 9.3: la tabla link_replytiene una clave foránea llamada which_groupapuntando a la tabla link_group.
Quiero eliminar todas las filas de link_groupdonde no link_replyexiste una fila relacionada . Suena bastante básico pero he estado luchando con eso.
¿Será algo simple como esto (no funciona)?
DELETE FROM link_group WHERE link_reply = NULL;
postgresql
join
postgresql-9.3
delete
Hassan Baig
fuente
fuente

DELETE FROM links_group USING links_group AS lg LEFT JOIN links_reply AS lr ON lg.col= lr.some_other_col WHERE links_reply.some_other_col IS NULLRespuestas:
Citando el manual:
El énfasis audaz es mío. Usar información que no está contenida en otra tabla es un poco complicado, pero hay soluciones fáciles. Desde el arsenal de técnicas estándar hasta ...
... un
NOT EXISTSanti-semi-join es probablemente el más simple y más eficiente paraDELETE:Asumiendo (dado que no se proporcionan definiciones de tabla)
link_group_idcomo nombre de columna para la clave primaria delink_group.La técnica que comentó @Mihai también funciona (aplicada correctamente):
Pero dado que la expresión de tabla en la
USINGcláusula se une a la tabla de destino (lgen el ejemplo) con aCROSS JOIN, necesita otra instancia de la misma tabla que el trampolín (lg1en el ejemplo) para elLEFT JOIN, que es menos elegante y generalmente más lento.fuente