MySQL में किसी टेबल में मौजूद नहीं होने वाले मानों को खोजने के लिए, UNION ALL के साथ WHERE NOT EXISTS या NOT IN का उपयोग करें। यह "गैप विश्लेषण" या मिसिंग सीक्वेंस खोजने के लिए उपयोगी है।
उदाहरण: मिसिंग ऑटो-इन्क्रीमेंट मान खोजना
ऑटो-इन्क्रीमेंट टेबल बनाएं:
mysql> CREATE TABLE DemoTable1918 (
Value INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
5 रिकॉर्ड इन्सर्ट करें (Value 1 से 5 तक):
mysql> INSERT INTO DemoTable1918 VALUES (), (), (), (), ();
मौजूदा डेटा:
+-------+ | Value | +-------+ | 1 | | 2 | | 3 | | 4 | | 5 | +-------+
6, 7, 8 मान जो टेबल में नहीं हैं, उन्हें खोजें:
mysql> SELECT tbl.Value
FROM (
SELECT 6 AS Value UNION ALL
SELECT 7 UNION ALL
SELECT 8
) tbl
WHERE NOT EXISTS (
SELECT 1 FROM DemoTable1918 tbl1
WHERE tbl1.Value = tbl.Value
);
आउटपुट:
+-------+ | Value | +-------+ | 6 | | 7 | | 8 | +-------+
वैकल्पिक दृष्टिकोण
1. NOT IN का उपयोग (सावधानी: NULL मान समस्या पैदा कर सकते हैं)
SELECT val FROM (
SELECT 6 AS val UNION ALL SELECT 7 UNION ALL SELECT 8
) t
WHERE val NOT IN (SELECT Value FROM DemoTable1918);
2. LEFT JOIN का उपयोग (बड़े डेटासेट के लिए अक्सर तेज़)
SELECT t.val
FROM (
SELECT 6 AS val UNION ALL SELECT 7 UNION ALL SELECT 8
) t
LEFT JOIN DemoTable1918 d ON d.Value = t.val
WHERE d.Value IS NULL;
3. सीक्वेंस जनरेट करना (MySQL 8.0+ CTE के साथ)
WITH RECURSIVE seq(n) AS (
SELECT 6 UNION ALL SELECT n+1 FROM seq WHERE n < 8
)
SELECT n FROM seq
WHERE n NOT IN (SELECT Value FROM DemoTable1918);
कब उपयोग करें
- मिसिंग ID/सीक्वेंस नंबर खोजने के लिए
- डेटा इंटीग्रिटी चेक के लिए
- रेफरेंस डेटा के विरुद्ध वैलिडेशन के लिए
NOT EXISTS आमतौर पर NOT IN से सुरक्षित है क्योंकि यह NULL मानों को सही ढंग से संभालता है।