2010-07-27 2 views
1

나는 쿼리가 있습니다.mysql 쿼리를 향상

는 그 왼쪽으로 쉽게 할 수있는 그런
DELETE FROM A 
WHERE i NOT IN 
(SELECT i FROM B 
); 

가입 :

DELETE FROM A 
WHERE i NOT IN 
(SELECT i FROM B WHERE j = 1 
    UNION select i from C 
    UNION select i from D 
); 

기본적으로 그냥 있었다면 필드 i 테이블 B, C 또는 D에서 발생하지 않는 모든 행을 삭제

DELETE A FROM A 
LEFT JOIN B 
ON A.i = B.i 
WHERE B.id is NULL; 

I 번지 (모든 테이블이 스키마에서 id 필드를 가지고 있다고 가정) 내 질문에 다음 위의 확장합니까 다음 솔루션과 세 테이블 시나리오? 이 같은

DELETE A FROM A 
LEFT JOIN B 
ON A.i = B.i AND B.j = 1 
LEFT JOIN C 
ON A.i = C.i 
LEFT JOIN D 
ON A.i = D.i 
WHERE B.id is NULL 
AND C.id is NULL 
AND D.id is NULL 
+0

는 각 요청이 무엇을 결정하기 위해 Explain을 사용하여 시도? –

+0

작동한다면 시도해 보셨습니까? 그렇게 나쁘게 들리는 것은 아닙니다. – Bobby

+0

실행되고 실행되며 수행해야하는 것처럼 보입니다. 이제 조금 더 시간을 보내고 나면 더 편안해집니다. 또한 내부 선택/조합 코드보다 훨씬 빠르게 실행됩니다. – bradgonesurfing

답변

2

뭔가 :

DELETE 
    FROM A 
WHERE NOT EXISTS (
        SELECT * 
        FROM B 
        WHERE B.i = A.i 
       ) 
     AND NOT EXISTS (
         SELECT * 
         FROM C 
         WHERE C.i = A.i 
        ) 
     AND NOT EXISTS (
         SELECT * 
         FROM D 
         WHERE D.i = A.i 
        ); 
+0

그것은 일반적으로 항상 내 경험에 나쁜 생각입니다. 조건 중 하나가 외부 테이블에 종속되는 내부 선택은 매우 느립니다. – bradgonesurfing

+0

@bradgonesurfing : 스키마 나 데이터를 게시하지 않았으므로 테스트 할 수 없습니다. 너 ...? – onedaywhen

+0

자체 설명 스키마가 아닌가요? 각 테이블에는 두 개의 필드가 있습니다. id - 기본 키 i - integer – bradgonesurfing