MySQL में उसी टेबल से चयन करके हटाने पर ERROR 1093 (HY000): You can't specify target table for update in FROM clause त्रुटि होती है। समाधान: सबक्वेरी को डिराइव्ड टेबल (उपनाम के साथ) में लपेटें।
समस्या
mysql> DELETE FROM DemoTable WHERE Marks = (SELECT MIN(Marks) FROM DemoTable); ERROR 1093 (HY000): You can't specify target table 'DemoTable' for update in FROM clause
समाधान: डिराइव्ड टेबल (उपनाम आवश्यक)
DELETE FROM DemoTable
WHERE Marks = (
SELECT lowestMarks FROM (
SELECT MIN(Marks) AS lowestMarks FROM DemoTable
) AS deleteRecord
) LIMIT 1;
उदाहरण
1. टेबल बनाएं
mysql> CREATE TABLE DemoTable1597 (Marks INT);
2. डेटा डालें
mysql> INSERT INTO DemoTable1597 VALUES(45), (59), (43), (85), (89);
3. न्यूनतम मान वाली एक पंक्ति हटाएं
mysql> DELETE FROM DemoTable1597
-> WHERE Marks = (
-> SELECT lowestMarks FROM (
-> SELECT MIN(Marks) AS lowestMarks FROM DemoTable1597
-> ) AS deleteRecord
-> ) LIMIT 1;
4. परिणाम
mysql> SELECT * FROM DemoTable1597;
+-------+ | Marks | +-------+ | 45 | | 59 | | 85 | | 89 | +-------+
न्यूनतम मान 43 वाली पंक्ति हटा दी गई।
क्यों काम करता है
- आंतरिक सबक्वेरी
MIN(Marks)की गणना करती है - मध्यवर्ती डिराइव्ड टेबल
AS deleteRecordपरिणाम को भौतिकीकृत करती है - बाहरी सबक्वेरी डिराइव्ड टेबल से पढ़ती है (मूल टेबल नहीं)
- MySQL को लगता है अलग टेबल से पढ़ रहे हैं
अन्य समाधान
JOIN के साथ (MySQL-विशिष्ट)
DELETE t1 FROM DemoTable1597 t1 JOIN (SELECT MIN(Marks) AS min_mark FROM DemoTable1597) t2 ON t1.Marks = t2.min_mark LIMIT 1;
MySQL 8.0+: CTE
WITH min_val AS (SELECT MIN(Marks) AS min_mark FROM DemoTable1597) DELETE FROM DemoTable1597 WHERE Marks = (SELECT min_mark FROM min_val) LIMIT 1;
बहु-टेबल DELETE सिंटैक्स
DELETE t1 FROM DemoTable1597 t1 INNER JOIN (SELECT MIN(Marks) AS min_mark FROM DemoTable1597) t2 ON t1.Marks = t2.min_mark LIMIT 1;
LIMIT 1 का महत्व
डुप्लिकेट न्यूनतम मान होने पर केवल एक पंक्ति हटाने के लिए।