2012-10-30 3 views
2

식별자에 일대일로 관련된 세 개의 테이블이 있습니다. 데이터의여러 관련 테이블에서 행 삭제

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; 

많은 : 나는 A.ID = B.ID = C.ID

지금은 다음과 같은 방법으로 그것을 할 기준과 일치하는 세 개의 테이블의 모든 레코드를 삭제해야 매우 긴 실행을위한이 방법. 더 빨리 삭제할 수있는 방법이 있습니까?

+1

왜 임시 테이블에 ID 값을 넣은 다음 임시 테이블에 대한 조인의 각 테이블에서 삭제하지 않습니까? –

+1

테이블에 'Foreign Keys'가 있다면'ON DELETE CASCADE'를 추가 할 수 있습니다. –

답변

3

ID를 저장하기 위해 PL/SQL 유형을 생성 할 수 있습니다.

CREATE TYPE t_ids AS TABLE OF NUMBER; 

는 테이블 CRITERIAS 일치 a의 모든 기록을 삭제하고 해당 유형의 변수에 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; 

ID 당 3 개의 명령문 대신 3 개의 SQL 문으로 루프를 수행하지 않고 모든 작업을 수행하므로 훨씬 더 효율적입니다.