2013-07-25 3 views
1
내가 특정 테이블에서 데이터를 삭제해야

두 테이블을 조인하여 쿼리, 그래서 나는 다음과 같은 쿼리를 사용하고 있습니다 :삭제 비용 효율적 방법

delete from table_a 
where objectname in 
    (Select object_name from table_b where resolved='Y'); 

는 이제 Select object_name from table_b where resolved='Y' 쿼리가 4 개 백만 이상의 레코드를 반환됩니다 따라서 실행에 많은 시간이 걸릴 것입니다. 나는 비용 효율적인 방법으로 그것을 쓰려고 노력하고있다.

SQL Error: ORA-00911: invalid character 00911. 00000 - "invalid character" *Cause: identifiers may not start with any ASCII character other than letters and numbers. $#_ are also allowed after the first character. Identifiers enclosed by doublequotes may contain any character other than a doublequote. Alternative quotes (q'#...#') cannot use spaces, tabs, or carriage returns as delimiters. For all other contexts, consult the SQL Language Reference Manual.

이 도와주세요 :

DELETE FROM table_a 
WHERE EXISTS (SELECT 1 FROM table_b WHERE object_name= objectname AND RESOLVED = ‘Y’) 
AND ROWNUM < 10000; 

는하지만 오류가있을 것 같습니다!

+0

* "오류가있는 것 같습니다."* 정확히 어떤 오류가 발생합니까? –

+0

SQL 오류 : ORA-00911 : 유효하지 않은 문자 00911. 00000 - "유효하지 않은 문자" * 원인 : 식별자는 문자 및 숫자 이외의 ASCII 문자로 시작할 수 없습니다. 첫 번째 문자 뒤에 $ # _도 사용할 수 있습니다. 이중 인용 부호로 묶인 식별자는 이중 인용 부호 이외의 문자이면 을 포함 할 수 있습니다. 대체 인용 부호 (q '# ... #')은 공백, 탭 또는 캐리지 리턴을 구분 기호로 사용할 수 없습니다. 다른 모든 문맥에 대해서는 SQL 언어 Reference Manual을 참조하십시오. – Ankit

+2

아마도 재미있는 따옴표로 인해 : 'Y'. 첫 번째 예제와 같이''Y ''로 시도하십시오. –

답변

0

당신이 table_a

  • table_a를 참조 table_b에 외래 키에

    • 기본 키를 가지고 그

    SET NULL을 수행 할 수 있습니다 DELETE ON CASCADE 삭제 ON으로 설정되거나 가정 이 경우 인라인보기를 사용하십시오.

    create table table_a as (select distinct object_name from all_objects); 
    alter table table_a add constraint pk_a primary key (object_name); 
    
    create table table_b as (
        select 
        distinct object_name, 
        (case when object_name like 'A%' then 'Y' else 'N' end) as resolved 
        from table_a);  
    alter table table_b add constraint fk_b_a foreign key (object_name) 
        references table_a(object_name) on delete cascade; 
    
    delete from (
        select b.resolved 
        from table_a a 
        join table_b b on a.object_name = b.object_name) 
    where resolved = 'Y'; 
    

    정직하게 말하면, EXISTS/IN a pproach는 훨씬 깔끔하고 이해하기 쉽습니다.

  • +0

    표 A에서 삭제 WHERE EXISTS (SELECT object_name FROM 표 WHERE object_name = objectname 및 RESOLVED = 'Y') 및 ROWNUM <10000; 테이블 A에서 4 백만 건이 넘는 레코드를 삭제해야하므로이 쿼리를 실행할 때마다 결과 세트가 10K 레코드를 삭제하도록 제한합니다. 그 맞습니까? – Ankit