MySQL-এ একই টেবিল আপডেট/ডিলিট করার কোয়েরির ভিতর সাবকোয়েরিতে সেই টেবিল রেফারেন্স দিলে ERROR 1093 (HY000): You can't specify target table for update in FROM clause দেখা দেয়। সমাধান: সাবকোয়েরিকে ডিরাইভড টেবিল (এলিয়াসসহ) হিসেবে র্যাপ করুন।
উদাহরণ: ন্যূনতম Marks ডিলিট করা
১. টেবিল তৈরি করুন
mysql> CREATE TABLE DemoTable1597 (Marks INT);
২. ডেটা ইনসার্ট করুন
mysql> INSERT INTO DemoTable1597 VALUES(45), (59), (43), (85), (89);
৩. সব রেকর্ড দেখুন
mysql> SELECT * FROM DemoTable1597;
আউটপুট: 45, 59, 43, 85, 89
৪. ❌ ভুল কোয়েরি (ERROR 1093)
DELETE FROM DemoTable1597 WHERE Marks = (SELECT MIN(Marks) FROM DemoTable1597) LIMIT 1;
৫. ✅ সঠিক কোয়েরি (ডিরাইভড টেবিল + এলিয়াস)
mysql> DELETE FROM DemoTable1597
-> WHERE Marks = (
-> SELECT lowestMarks FROM (
-> SELECT MIN(Marks) AS lowestMarks FROM DemoTable1597
-> ) AS deleteRecord
-> ) LIMIT 1;
৬. ডিলিট পরের রেকর্ড দেখুন (৪৩ ডিলিট হয়েছে)
mysql> SELECT * FROM DemoTable1597;
আউটপুট:
+-------+
| Marks |
+-------+
| 45 |
| 59 |
| 85 |
| 89 |
+-------+
ব্যাখ্যা: ইনার সাবকোয়েরি (SELECT MIN(Marks) ...) রেজাল্ট সেট রিটার্ন করে। বাহ্যিক SELECT lowestMarks FROM (...) AS deleteRecord একটি ডিরাইভড টেবিল (টেম্পোরারি টেবিল) বানায়, যা MySQL-কে মনে করায় যে এটি আলাদা একটি টেবিল। ফলে ERROR 1093 এড়ে যায়।
MySQL 8.0+ CTE ব্যবহার করে আরও পঠনযোগ্য:
WITH to_delete AS (SELECT MIN(Marks) AS min_mark FROM DemoTable1597)
DELETE FROM DemoTable1597 WHERE Marks = (SELECT min_mark FROM to_delete) LIMIT 1;