Необходимо с помощью запроса получить таблицу с одной колонкой, в которой будет содержаться ряд чисел от 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, что и требуется.
В заключение выводим и сортируем по возрастанию получившийся числовой ряд.