যতটা উদ্বেগের দিক থেকে, আপনি সারিগুলি সরাতে চান 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
একটি subquery যে সঙ্গে JOIN
গুলি মূল টেবিল unecessarily সংবর্ত মনে। এটি আরও একটি সরাসরি-ফরোয়ার্ড পদ্ধতিতে প্রকাশ করা যেতে পারে 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);
এই ক্যোয়ারটি যে কোনও মাইএসকিউএল সংস্করণে চলবে, সেই সাথে আমি জানি এমন বেশিরভাগ অন্যান্য ডাটাবেসেও চালিত হবে।
ডিবি ফিডেলে ডেমো :
-- 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);
| বিভাগ_আইডি |
| ----------: |
| 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)
| বিভাগ_আইডি |
| ----------: |
| 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;
| বিভাগ_আইডি |
| ----------: |
| 4 |
| 5 |