2012-09-15 8 views

Respuesta

2

Puede usar EXECUTE BLOCK para escanear secuencialmente la tabla de detalles y eliminar registros donde no coinciden registros maestros.

EXECUTE BLOCK 
AS 
    DECLARE VARIABLE C CURSOR FOR 
    (SELECT d.id 
    FROM detail d LEFT JOIN master m 
     ON d.master_id = m.id 
    WHERE m.id IS NULL); 
    DECLARE VARIABLE I INTEGER; 
BEGIN 
    OPEN C; 
    WHILE (1 = 1) DO 
    BEGIN 
    FETCH C INTO :I; 
    IF(ROW_COUNT = 0)THEN 
     LEAVE; 
    DELETE FROM detail WHERE id = :I; 
    END 
    CLOSE C; 
END 
3

(NOT) IN generalmente se puede optimizar utilizando (NOT) EXISTS en su lugar.

DELETE 
FROM SLAVE_TABLE 
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID) 

no estoy seguro de lo que está tratando de hacer aquí, pero para mí esta consulta indica que se debe utilizar claves externas para imponer este tipo de restricciones, no ejecutar consultas para limpiar el desorden después.

+0

La clave externa con la regla ON DELETE CASCADE haría el trabajo automáticamente. –

+0

La clave externa sería óptima, por supuesto, pero desafortunadamente es demasiado tarde en este caso. – Harriv

+0

Ok, pero después de ejecutar esta consulta, asegúrese de agregar dicha restricción (por ejemplo, con ON DELETE CASCADE como lo sugiere Andrei). –