Tengo dos tablas en una base de datos PostgreSQL 9.3: la tabla link_reply
tiene una clave foránea llamada which_group
apuntando a la tabla link_group
.
Quiero eliminar todas las filas de link_group
donde no link_reply
existe 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 NULL
Respuestas:
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 EXISTS
anti-semi-join es probablemente el más simple y más eficiente paraDELETE
:Asumiendo (dado que no se proporcionan definiciones de tabla)
link_group_id
como 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
USING
cláusula se une a la tabla de destino (lg
en el ejemplo) con aCROSS JOIN
, necesita otra instancia de la misma tabla que el trampolín (lg1
en el ejemplo) para elLEFT JOIN
, que es menos elegante y generalmente más lento.fuente