2012-10-30 69 views
2

標識符上有一對一關聯的表。我需要刪除符合條件的A.ID = B.ID = C.ID刪除多個相關表中的行

現在我這樣做以下列方式三個表中的所有記錄:

DECLARE 
    CURSOR CUR IS 
     SELECT C.ID FROM A 
     INNER JOIN B ON A."ID" = B."ID" 
     INNER JOIN C ON B."ID" = C."ID" 
     WHERE A.STATUS = 'ERROR'; 
    IDX NUMBER; 
BEGIN 
    FOR REC IN CUR LOOP 
     IDX := REC.ID; 
     DELETE FROM C WHERE C."ID" = IDX; 
     DELETE FROM B WHERE B."ID" = IDX; 
     DELETE FROM A WHERE BP."ID" = IDX; 
    END LOOP; 
    COMMIT; 
END; 

大量的數據這種方式需要很長的時間。有什麼方法可以更快地刪除?

+1

爲什麼不將ID值放入臨時表中,然後從連接中的每個表中刪除到臨時表? – 2012-10-30 05:32:18

+1

如果你在這些表上有'外鍵',你可以添加'ON DELETE CASCADE' –

回答

3

您可以創建一個PL/SQL類型來存儲這些ID。

CREATE TYPE t_ids AS TABLE OF NUMBER; 

DELETE FROM表a符合規定 - 所有記錄,以及ID返回到該類型的變量。然後用這些ID從bc中刪除所有記錄。

DECLARE 
    ids_to_delete t_ids; 
BEGIN 
    DELETE FROM a 
    WHERE a.status = 'ERROR' 
    AND EXISTS (SELECT 1 FROM b WHERE b.id = a.id) 
    AND EXISTS (SELECT 1 FROM c WHERE c.id = a.id) 
    RETURNING a.id 
    BULK COLLECT INTO ids_to_delete; 

    DELETE FROM b 
    WHERE id IN (SELECT COLUMN_VALUE FROM TABLE(ids_to_delete)); 

    DELETE FROM c 
    WHERE id IN (SELECT COLUMN_VALUE FROM TABLE(ids_to_delete)); 
END; 

這應該會更好一些,因爲它不需要循環,而是在三個SQL語句中執行所有操作,而不是每個ID執行三個語句。