सीक्वेंस में गैप (छूटा हुआ न्यूनतम मान) खोजने की क्वेरी
एक ऑटो-इन्क्रीमेंट या मैनुअल सीक्वेंस कॉलम में सबसे छोटा अनुपयोगी (मिसिंग) मान खोजने के लिए LEFT JOIN सेल्फ-जॉइन तकनीक का उपयोग करें।
टेबल और डेटा
CREATE TABLE FindValue (SequenceNumber INT); INSERT INTO FindValue VALUES (109), (110), (111), (113), (114);
क्वेरी: न्यूनतम मिसिंग मान
SELECT tbl1.SequenceNumber + 1 AS ValueNotUsedInSequenceNumber FROM FindValue AS tbl1 LEFT JOIN FindValue AS tbl2 ON tbl1.SequenceNumber + 1 = tbl2.SequenceNumber WHERE tbl2.SequenceNumber IS NULL ORDER BY tbl1.SequenceNumber LIMIT 1;
आउटपुट
+------------------------------+ | ValueNotUsedInSequenceNumber | +------------------------------+ | 112 | +------------------------------+
कैसे काम करता है
tbl1प्रत्येक पंक्ति को लेता है और अगला मान (+1) जांचता है।LEFT JOINtbl2पर उसी अगले मान से मिलान करता है।WHERE tbl2.SequenceNumber IS NULLका अर्थ है वह अगला मान टेबल में मौजूद नहीं है।ORDER BY ... LIMIT 1सबसे छोटा ऐसा मान देता है।
वैकल्पिक: MySQL 8.0+ में विंडो फ़ंक्शन
SELECT MIN(SequenceNumber) + 1 AS MissingValue
FROM (
SELECT SequenceNumber,
LAG(SequenceNumber) OVER (ORDER BY SequenceNumber) AS prev_val
FROM FindValue
) t
WHERE SequenceNumber - prev_val > 1
UNION ALL
SELECT MIN(SequenceNumber) - 1 FROM FindValue WHERE MIN(SequenceNumber) > 1
LIMIT 1;
पहली विधि सभी संस्करणों में काम करती है और समझने में आसान है।