에 관한 한,에 story_category
존재하지 않는 행을 삭제하려고합니다 category
.
삭제할 행을 식별하기위한 원래 쿼리는 다음과 같습니다.
SELECT *
FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category INNER JOIN
story_category ON category_id=category.id
);
원래 테이블의 NOT IN
하위 쿼리와 결합하면 JOIN
불필요하게 복잡하게 보입니다. 이는 not exists
상관 하위 쿼리 를 사용하여보다 간단하게 표현할 수 있습니다 .
select sc.*
from story_category sc
where not exists (select 1 from category c where c.id = sc.category_id);
이제 이것을 delete
문장 으로 바꾸는 것이 쉽습니다 .
delete from story_category
where not exists (select 1 from category c where c.id = story_category.category_id);
이 퀘스트는 모든 MySQL 버전과 내가 아는 다른 대부분의 데이터베이스에서 실행됩니다.
DB Fiddle 데모 :
-- set-up
create table story_category(category_id int);
create table category (id int);
insert into story_category values (1), (2), (3), (4), (5);
insert into category values (4), (5), (6), (7);
-- your original query to identify offending rows
SELECT *
FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category INNER JOIN
story_category ON category_id=category.id);
| category_id |
| ---------- : |
| 1 |
| 2 |
| 3 |
-- a functionally-equivalent, simpler query for this
select sc.*
from story_category sc
where not exists (select 1 from category c where c.id = sc.category_id)
| category_id |
| ---------- : |
| 1 |
| 2 |
| 3 |
-- the delete query
delete from story_category
where not exists (select 1 from category c where c.id = story_category.category_id);
-- outcome
select * from story_category;
| category_id |
| ---------- : |
| 4 |
| 5 |