2012-09-15 9 views

risposta

2

È possibile utilizzare EXECUTE BLOCK per la scansione sequenziale della tabella dei dettagli e l'eliminazione dei record in cui nessun record master è abbinato.

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 può essere ottimizzato in genere utilizzando (NOT) EXISTS.

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

io non sono sicuro di quello che si sta cercando di fare qui, ma a me questa domanda indica che si dovrebbe utilizzare chiavi esterne per far rispettare questo tipo di vincoli, non eseguire le query per la pulizia il pasticcio dopo.

+0

La chiave esterna con la regola ON DELETE CASCADE esegue automaticamente il lavoro. –

+0

Ovviamente la chiave esterna sarebbe ottimale, ma purtroppo in questo caso è troppo tardi. – Harriv

+0

Ok, ma dopo aver eseguito questa query, assicurati di aggiungere un tale vincolo (es. Con ON DELETE CASCADE come suggerito da Andrei). –