Выберите числа, которых нет в столбце - PullRequest
2 голосов
/ 31 августа 2011

У меня есть столбец типа integer, и записи пока что имеют номера от 1 до 270. Я хотел бы написать запрос, который возвращает числа, которых нет в базе данных от 1 до 270. например № 5, 10, 15, 117 отсутствуют. Так что запрос должен вернуть эти числа. И некоторые цифры пропущены, потому что количество записей меньше 270, и поиск по ним нецелесообразен.

спасибо

1 Ответ

3 голосов
/ 31 августа 2011

Выполните самостоятельное соединение, чтобы найти последовательные номера, и там, где нет совпадений, у вас есть пропущенный номер.

SELECT t1.i-1 AS missing_i
FROM thetable t1 LEFT OUTER JOIN thetable t2 ON t1.i-1 = t2.i
WHERE t2.i IS NULL

Но это не находит все пропущенные числа, только те, которые на единицу меньше числа, которое присутствует. Если все ваши пробелы только одно число, это нормально. Но если у вас есть пробелы, которые представляют собой последовательности из двух или более чисел, вам, возможно, придется использовать альтернативную технику:

Создайте таблицу и заполните ее целыми числами от 1 до 270:

CREATE TABLE n (i INT AUTO_INCREMENT PRIMARY KEY, dummy INT);
INSERT INTO n (dummy) VALUES (0);          -- now you have 1 row
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 2 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 4 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 8 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 16 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 32 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 64 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 128 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 256 rows
INSERT INTO n (dummy) SELECT dummy FROM n; -- now you have 512 rows

Теперь вы можете выполнить внешнее объединение для поиска тех целых чисел, которые отсутствуют в исходной таблице:

SELECT n.i AS missing_i
FROM n LEFT OUTER JOIN thetable t ON n.i = t.i
WHERE n.i <= 270 AND t.i IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...