Напишем SQL-запрос для генерации последовательности номеров счастливых билетов. Обойдемся без циклов, курсоров и прочей ерунды. Возьмем в помощь оператор WITH.
WITH
digits (
d
)
AS (
SELECT 0 AS d
UNION SELECT 1
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7
UNION SELECT 8
UNION SELECT 9
)
SELECT
CAST(d1.d AS varchar(1)) +
CAST(d2.d AS varchar(1)) +
CAST(d3.d AS varchar(1)) +
CAST(d4.d AS varchar(1)) +
CAST(d5.d AS varchar(1)) +
CAST(d6.d AS varchar(1))
FROM digits d1
CROSS JOIN digits d2
CROSS JOIN digits d3
CROSS JOIN digits d4
CROSS JOIN digits d5
CROSS JOIN digits d6
WHERE d1.d + d2.d + d3.d = d4.d + d5.d + d6.d
ORDER BY d1.d, d2.d, d3.d, d4.d, d5.d, d6.d
Пожалуйста. Время выполнения - менее секунды. Все просто и понятно.
Самое тяжелое, что меня напрягает в SQL - отсутствие стандартных средств для генерации последовательностей. Если необходимо сгенерировать числа в месяце, разбивку дней по часам-минутам - очень хлопотное дело.