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

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 행이 삭제 됩니다.



답변

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에 없음) 롤백을 사용하여 문제가 발생할 경우 변경 사항을 되돌릴 수 있습니다.


답변

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...*/
      )


답변

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


답변

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);


답변