2012-09-15 5 views

Antwort

2

Sie können EXECUTE BLOCK für das sequentielle Scannen von Detailtabellen und das Löschen von Datensätzen verwenden, für die kein Stammdatensatz gefunden wurde.

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 kann normalerweise mit (NOT) EXISTS stattdessen optimiert werden.

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

Ich bin nicht sicher, was Sie versuchen, hier zu tun, aber mir diese Abfrage zeigt an, dass Sie Fremdschlüssel verwenden sollen, um diese Art von Einschränkungen, nicht ausgeführt Abfragen Bereinigung des Chaos danach zu erzwingen.

+0

Fremdschlüssel mit ON DELETE CASCADE Regel würde den Job automatisch erledigen. –

+0

Fremdschlüssel wäre natürlich optimal, aber leider ist es in diesem Fall zu spät. – Harriv

+0

Ok, aber nachdem Sie diese Abfrage ausgeführt haben, stellen Sie sicher, dass Sie eine solche Einschränkung hinzufügen (z. B. mit ON DELETE CASCADE wie von Andrei vorgeschlagen). –