সিকোয়েন্স নম্বরের কালামে যে মানটি অনুপস্থিত (missing) সেটি খুঁজে বের করতে LEFT JOIN সেলফ-জয়েন পদ্ধতি ব্যবহার করা হয়।
টেবিল ও ডেটা তৈরি
CREATE TABLE find_value (
sequence_number INT
);
INSERT INTO find_value VALUES (109), (110), (111), (113), (114);
নোট: ১১২ অনুপস্থিত।
LEFT JOIN ক্যোয়ারি
SELECT tbl1.sequence_number + 1 AS missing_value
FROM find_value AS tbl1
LEFT JOIN find_value AS tbl2
ON tbl1.sequence_number + 1 = tbl2.sequence_number
WHERE tbl2.sequence_number IS NULL
ORDER BY tbl1.sequence_number
LIMIT 1;
ফলাফল
+----------------+
| missing_value |
+----------------+
| 112 |
+----------------+
কিভাবে কাজ করে
tbl1— মূল টেবিলtbl2— একই টেবিল, কিন্তু প্রতিটি সিকোয়েন্সের পরবর্তী মান (+1) দিয়ে জয়েন- যদি
tbl2.sequence_number IS NULLহয়, অর্থাৎ পরবর্তী মান টেবিলে নেই ORDER BY ... LIMIT 1— সবচেয়ে ছোট অনুপস্থিত মান দেয়
আধুনিক পদ্ধতি (MySQL 8.0+ / MariaDB 10.2+): CTE + WINDOW FUNCTION
WITH numbered AS (
SELECT sequence_number,
LAG(sequence_number) OVER (ORDER BY sequence_number) AS prev_val
FROM find_value
)
SELECT prev_val + 1 AS missing_value
FROM numbered
WHERE sequence_number - prev_val > 1
ORDER BY prev_val
LIMIT 1;
প্রথম মissing মান (সিকোয়েন্স ১ থেকে শুরু হলে)
SELECT MIN(t1.sequence_number) + 1 AS first_missing
FROM find_value t1
LEFT JOIN find_value t2 ON t1.sequence_number + 1 = t2.sequence_number
WHERE t2.sequence_number IS NULL;
সব মissing মান পেতে
SELECT t1.sequence_number + 1 AS missing_start,
(SELECT MIN(t3.sequence_number) - 1
FROM find_value t3
WHERE t3.sequence_number > t1.sequence_number) AS missing_end
FROM find_value t1
LEFT JOIN find_value t2 ON t1.sequence_number + 1 = t2.sequence_number
WHERE t2.sequence_number IS NULL;