ID가 다른 테이블과 일치하지 않는 SQL 행 삭제


160

mysql 테이블에서 고아 항목을 삭제하려고합니다.

나는 이와 같은 2 개의 테이블을 가지고있다 :

files:

| id | ....
------------
| 1  | ....
| 2  | ....
| 7  | ....
| 9  | ....

테이블 blob:

| fileid | ....
------------
| 1  | ....
| 2  | ....
| 3  | ....
| 4  | ....
| 4  | ....
| 4  | ....
| 9  | ....

fileidid열 함께 테이블을 조인하는 데 사용할 수 있습니다.

테이블 blob에서 fileid찾을 수없는 테이블의 모든 행을 삭제하고 싶습니다 files.id.

따라서 위의 예를 사용하면 blob테이블 에서 3 & 4 행이 삭제 됩니다.


1
s를 사용하는 경우 두 번째 답변으로 건너 뜁니다 null.
Pacerier

답변:


327

LEFT JOIN / IS NULL 사용 :

DELETE b FROM BLOB b 
  LEFT JOIN FILES f ON f.id = b.fileid 
      WHERE f.id IS NULL

존재하지 않는 사용 :

DELETE FROM BLOB 
 WHERE NOT EXISTS(SELECT NULL
                    FROM FILES f
                   WHERE f.id = fileid)

NOT IN 사용 :

DELETE FROM BLOB
 WHERE fileid NOT IN (SELECT f.id 
                        FROM FILES f)

경고

가능하면 트랜잭션 내에서 DELETE를 수행하고 (지원되는 경우 : IE : MyISAM에 없음) 롤백을 사용하여 문제가 발생할 경우 변경 사항을 되돌릴 수 있습니다.


12
일반적으로 위 중 가장 빠른 것은 무엇입니까?
Hampus Brynolf

2
어떤 이유로 LEFT JOIN을 사용하여 삭제하면 MS SQL Server Mgmt Studio에서 작동하지 않습니다 (이유는 확실하지 않습니다. LEFT JOIN에 대해서만 불평했습니다). 왜 그런지 아는 사람이 있습니까? NOT EXISTS를 사용하여 작동했습니다 :)
Anna

5
참고로, 여기이 세 가지 방법의 상대적 효율성의 유용한 논의는 다음과 같습니다 explainextended.com/2009/09/18/...
moustachio은

2
@Pacerier- "잘못"은 약간 강하다. 사람들이 이해할 수 있도록 null아닌 경우 답변 작동합니다 . 또한 세 번째 솔루션 ( )은 널 입력 불가 로만 필요합니다 . 아마도 이것이 기본 키일 것입니다. fileidNOT INf.id
ToolmakerSteve

2
이 w / SQLite를 시도하는 사람들의 경우 : 이 답변
bunkerdive

26
DELETE FROM blob 
WHERE fileid NOT IN 
       (SELECT id 
        FROM files 
        WHERE id is NOT NULL/*This line is unlikely to be needed 
                               but using NOT IN...*/
      )

뭐가 "/ *이 줄은 필요하지 않을 것입니다하지만 NOT IN ... * / 사용" 뜻?
Pacerier

1
@Pacerier- NOT IN (NULL)빈 결과 집합을 반환하므로 NULL을 제외해야합니다. 그러나 id어쨌든 컬럼은 널 입력 가능하지 않으므로 "필요하지 않을 것"입니다
Martin Smith

와우 잘 잡아. 그래서 omgponies의 대답은 잘못되었습니다! not in(null)논리적인데 왜 작동하지 않습니까? 그 뒤에 근거는 무엇입니까?
Pacerier


1
@bunkerdive 그런 다음 데이터베이스 이름을 포함하는 세 부분으로 된 개체 이름을 사용하십시오.
마틴 스미스

17
DELETE FROM blob
WHERE NOT EXISTS (
    SELECT *
    FROM files
    WHERE id=blob.id
)

1
나는 있다고 생각 files.id하고 blob.fileid. 귀하의 검색어에 오류가 발생한다고 추측합니다.
jww

-8
delete from table1 t1 
    WHERE not exists (select id from table2 where related_field_in_t2=t1.id) 
    AND not exists (select id from table3 where related_field_in_t3=t1.id) 
    AND not exists (select id from table4 where related_field_t4=t1.id) 
    AND not exists (select id from table5 where related_field_t5=t1.id);

3
나는 다음과 같은 이유로 투표를 중단했습니다. 1. 이것은 게시 된 상황에서 질문에 대답하지 않습니다. 2. 설명이 없습니다 (그리고 코드 전용 답변은 Stackoverflow에서 낮은 값입니다). 3. NOT EXISTS9 년 전에 이미 게시되었습니다. 4. MySQL 키워드에 대한 모든 대문자를 일관되게 사용하는 모범 사례를 홍보하지 않았습니다. 다시 말해, 여기에는 가치가없는 것이 있습니다. 이것이 제가이 게시물을 삭제하기로 한 이유입니다.
mickmackusa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.