SQL-запросы не имеют механизма зацикливания. Языки процедур имеют циклы, но сами запросы могут «зацикливать» только те данные, которые они находят в таблице (или производной таблице).
Что мне нужно сделать, чтобы создать список чисел на лету, так это сделать перекрестное соединение на небольшой таблице цифр от 0 до 9:
CREATE TABLE n (d NUMERIC);
INSERT INTO n VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
Затем сгенерировать 00..99:
SELECT n1.d + n2.d*10 AS d
FROM n AS n1 CROSS JOIN n AS n10;
Если вы хотите только 00..57:
SELECT n1.d + n2.d*10 AS d
FROM n AS n1 CROSS JOIN n AS n2
WHERE n1.d + n2.d*10 <= 57;
Конечно, вы можете присоединиться к таблице для места 100, места 1000 и т. Д. Обратите внимание, что вы не можете использовать псевдонимы столбцов в предложении WHERE, поэтому вам придется повторить полное выражение.
Теперь вы можете использовать это как производную таблицу в предложении FROM
и присоединить ее к вашей таблице данных.
SELECT n0.d, mytable.value
FROM
(SELECT n1.d + n2.d*10 + n2.d*100 + n3.d*1000
+ n4.d*10000 + n5.d*100000 AS d
FROM n AS n1 CROSS JOIN n AS n2 CROSS JOIN n AS n3
CROSS JOIN n AS n4 CROSS JOIN n AS n5) AS n0
LEFT OUTER JOIN mytable ON (n0.d = mytable.key)
WHERE n0.d <= (SELECT MAX(key) FROM mytable);
Вам нужно добавить еще CROSS JOIN
каждый раз, когда размер вашей таблицы превышает порядок. Например. когда он превысит 1 миллион, добавьте объединение для n6
.
Обратите внимание, что теперь мы можем использовать псевдоним столбца в предложении WHERE внешнего запроса.
По общему признанию, это может быть довольно дорогим запросом сделать это исключительно в SQL. Вы можете обнаружить, что проще и быстрее «заполнить пробелы», написав некоторый код приложения.