MySQL-এ একই টেবিল থেকে সাবকোয়েরি দিয়ে ডিলিট করতে ডেরাইভড টেবিল (derived table) ব্যবহার করতে হয়, কারণ MySQL একই টেবিলকে একসাথে রিড এবং রাইট করতে দেয় না।
টেবিল ও ডেটা তৈরি
mysql> CREATE TABLE DemoTable1947 (Id INT, Name VARCHAR(20));
mysql> INSERT INTO DemoTable1947 VALUES
(101, 'Chris'), (102, 'David'), (103, 'Mike'), (104, 'Bob'), (105, 'Sam');
ডেটা যাচাই
mysql> SELECT * FROM DemoTable1947;
+------+-------+ | Id | Name | +------+-------+ | 101 | Chris | | 102 | David | | 103 | Mike | | 104 | Bob | | 105 | Sam | +------+-------+
সাবকোয়েরি দিয়ে প্রথম ৩টি সারি ডিলিট
mysql> DELETE FROM DemoTable1947
WHERE Id IN (
SELECT * FROM (
SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
) AS t
);
ব্যাখ্যা:
- ইননার সাবকোয়ারী:
SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3— প্রথম ৩টি Id (101, 102, 103)। SELECT * FROM (...) AS t— ডেরাইভড টেবিল (এলিয়াসtবাধ্যতামূলক)।- বাইরের
DELETE ... WHERE Id IN (...)— সাবকোয়ারী ফলাফল ব্যবহার করে ডিলিট।
আউটপুট: Query OK, 3 rows affected (0.00 sec)
ডিলিটের পর
mysql> SELECT * FROM DemoTable1947;
+------+------+ | Id | Name | +------+------+ | 104 | Bob | | 105 | Sam | +------+------+
MySQL 8.0+ এ CTE ব্যবহার (আরও পঠনীয়)
WITH to_delete AS (
SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
)
DELETE FROM DemoTable1947 WHERE Id IN (SELECT Id FROM to_delete);
সতর্কতা
- MySQL-এ
DELETE FROM t WHERE id IN (SELECT id FROM t ...)সরাসরি দিলেERROR 1093 (HY000): You can't specify target table 't' for update in FROM clauseএরর আসে। - ডেরাইভড টেবিল বা CTE ব্যবহার করে এই সীমাবদ্ধতা বাইপাস করা হয়।