2012-10-30 73 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执行三个语句。