Citando el manual:
Hay dos formas de eliminar filas en una tabla usando la información contenida en otras tablas de la base de datos: usando sub-selecciones o especificando tablas adicionales en la USING
cláusula . La técnica más apropiada depende de las circunstancias específicas.
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 para DELETE
:
DELETE FROM link_group lg
WHERE NOT EXISTS (
SELECT FROM link_reply lr
WHERE lr.which_group = lg.link_group_id
);
Asumiendo (dado que no se proporcionan definiciones de tabla) link_group_id
como nombre de columna para la clave primaria de link_group
.
La técnica que comentó @Mihai también funciona (aplicada correctamente):
DELETE FROM link_group lg
USING link_group lg1
LEFT JOIN link_reply lr ON lr.which_group = lg1.link_group_id
WHERE lg1.link_group_id = lg.link_group_id
AND lr.which_group IS NULL;
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 a CROSS JOIN
, necesita otra instancia de la misma tabla que el trampolín ( lg1
en el ejemplo) para el LEFT JOIN
, que es menos elegante y generalmente más lento.