Получение ряда чисел от 1 до 1000 в запросе

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

Решение 1

ВЫБРАТЬ 0 КАК Числа
ПОМЕСТИТЬ РядЧисел
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 9
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РядЧисел2.Числа * 100 + РядЧисел1.Числа * 10 + РядЧисел.Числа + 1 КАК Числа
ИЗ
    РядЧисел КАК РядЧисел,
    РядЧисел КАК РядЧисел1,
    РядЧисел КАК РядЧисел2
УПОРЯДОЧИТЬ ПО
    Числа

Небольшие комментарии. Первым делом формируется временная таблица с одной колонкой, в которой содержится числовой ряд от 0 до 9. Далее эта временная таблица соединяется сама с собой полным соединением, результатом чего будет декартово произведение. В итоговой таблице будет ровно 1000 строк (10*10*10). Значение единственной выходной колонки рассчитывается по формуле

ЧислоИзТаблицы1*N*N + ЧислоИзТаблицы2*N + ЧислоИзТаблицы3 + 1

где:

  • ЧислоИзТаблицы[1,2,3] — данные из первой, второй или третьей таблицы, участвующей в соединении;
  • N — количество элементов во временной таблице;
  • 1 — число, на которое необходимо сдвинуть значение наименьшего элемента в получившемся числовом ряде относительно наименьшего элемента во временной таблице. Т.е. если бы этого слагаемого не было, то получился бы числовой ряд от 0 до 999.

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

ГДЕ
    РядЧисел2.Числа * 100 + РядЧисел1.Числа * 10 + РядЧисел.Числа + 1 < 777

Решение 2

В данном решении используется факт, что все ссылки в 1С уникальны и их можно сравнивать друг с другом. Решение не универсально: в базе должна быть какая-то таблица ссылочного типа с необходимым количеством элементов.

ВЫБРАТЬ ПЕРВЫЕ 1000
    Номенклатура.Ссылка
ПОМЕСТИТЬ Спр
ИЗ
    Справочник.Номенклатура КАК Номенклатура
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВложенныйЗапрос.Количество КАК Числа
ИЗ
    (ВЫБРАТЬ
        Спр.Ссылка КАК Ссылка,
        КОЛИЧЕСТВО(Спр1.Ссылка) КАК Количество
    ИЗ
        Спр КАК Спр,
            ЛЕВОЕ СОЕДИНЕНИЕ Спр КАК Спр1
            ПО Спр.Ссылка >= Спр1.Ссылка
    СГРУППИРОВАТЬ ПО
    Спр.Ссылка) КАК ВложенныйЗапрос
УПОРЯДОЧИТЬ ПО
    Числа

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

Далее во вложенном запросе полученная временная таблица соединяется сама с собой по ссылкам на условие «>=». Т.к. ссылки уникальны, для каждой строки из левой таблицы будет найдено от 1 до N строк из правой, где N — это общее количество строк временной таблицы. Далее производится группировка ссылок левой таблицы с определением количества сопоставленных ссылок правой таблицы. В поле «Количество» будет содержаться ряд чисел от 1 до 1000, что и требуется.

В заключение выводим и сортируем по возрастанию получившийся числовой ряд.

Оцените статью