สำหรับความกังวลคุณต้องการลบแถว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 |