2014-12-08 2 views
0

내 질문이 이상하게 보일 수 있습니다. 그러나 나는 다음과 같은 목적을 위해 테이블에서 JOIN을 어떻게해야합니까?존재하지 않는 항목을 찾기 위해 테이블에 가입하는 방법

테이블이 categories입니다.

나는 다른 피벗 테이블이 정기적으로 나는 왼쪽이 하나 개의 제품의 범주를 얻기 위해 가입 할

categories_products라고합니다.

이제 몇 달 후에 categories 테이블에서 일부 카테고리가 삭제되었습니다. 나는 그 시간에 방아쇠를 당기는 것을 잊었다 (삭제 된 고양이의 관련된 모든 categories_products 기록을 삭제한다). categories_products에서 해당 범주 항목이 삭제 된 (존재하지 않는) 모든 레코드 (현재 사용되지 않는 것으로 간주 됨)를 삭제하려고합니다. 어떤 쿼리를 작성해야합니까? 아무것도 내 마음에 온다.

답변

3
delete from categories_products cp 
where not exists (select 1 from categories c where c.id = cp.category_id); 

또는

delete from categories_products cp 
where cp.category_id not in (select distinct c.id from categories c); 

그러나이 존재 덕분에 일반적으로 빠르다. 에서 ID가 (선택하지의 경우

DELETE categories_products 
FROM categories_products 
LEFT JOIN categories 
ON categories_products.categories_id = categories.id 
HAVING categories.id IS NULL; 
+0

첫 번째 코드에 구문 오류가있는 것 같습니다 –

+0

작동합니다. 앨리어싱에 문제가있었습니다. 어쨌든 고마워. –

+0

@ 모 스타 화 탈 레비. 예, DELETE 절의 테이블 별칭에 문제가있을 수 있습니다. http://stackoverflow.com/questions/10484532/delete-from-table-as-alias-where-alias-column-why-syntax-error – Multisync

0

이 다중 테이블은 더 빨리 그것은 (MySQL은 일반적으로 좋지 않다) 하위 쿼리를 필요로하지 않는해야 삭제 (c.id 형식을 선택하십시오 categories_products cp JOIN 범주 c ON cp.categories_id = c.id) x);

+0

Hm , 작동하지 않는 것 같습니다 ... –

+0

MySQL 다중 테이블 DELETE 구문이 지원하지 않습니다 : ( –

1

이 categories_products에게 삭제 * :

관련 문제