Lo que está viendo con el problema de la regla es que el sistema de reglas no maneja los datos de forma atómica. La primera eliminación se ejecuta independientemente del orden de las dos sentencias en la regla DO INSTEAD. La segunda declaración nunca se ejecuta porque la fila a la que hace referencia OLD.id se ha eliminado de la vista. Podría usar LEFT JOIN, pero eso no lo ayudará debido al diseño de la tabla de ejemplo (puede funcionar en su esquema de base de datos real).
El problema fundamental, como yo lo veo, es que estás tratando el sistema de reglas como si fuera un disparador.
Su mejor opción es usar claves foráneas y ON DELETE CASCADE
en lugar de reglas. Con ellos, su esquema de ejemplo también funcionaría:solo necesitaría eliminar para que la tabla principal se deshaga de todos los elementos secundarios.