Множественные вложенные циклы T-SQL

Этот T-SQL предназначен для записи в таблицу ([dbo]. [Unique_combinations]) всех возможных значений розыгрыша 6, 1 - 53 лотереи. Это начинается 1,2,3,4,5,6; 1,2,3,4,5,7 ... но он создаст только последние два столбца (draw05 и draw06). Очевидно, НИКТО никогда не делал этого раньше, и я абсолютно уникален. Я не могу найти пример даже трех вложенных операторов цикла While Loop, не говоря уже о 6. Пожалуйста, взгляните на этот код и скажите, чего мне ужасно не хватает.

ТИА -Давлё

DECLARE @start01 AS INT = 1
DECLARE @start02 AS INT = 2
DECLARE @start03 AS INT = 3
DECLARE @start04 AS INT = 4
DECLARE @start05 AS INT = 5
DECLARE @start06 AS INT = 6

DECLARE @draw01 AS INT = @start01
DECLARE @draw02 AS INT = @start02
DECLARE @draw03 AS INT = @start03
DECLARE @draw04 AS INT = @start04
DECLARE @draw05 AS INT = @start05
DECLARE @draw06 AS INT = @start06

TRUNCATE TABLE [dbo].[unique_combinations]

WHILE @draw01 <= 48
BEGIN 
    WHILE @draw02 <= 49
    BEGIN
        WHILE @draw03 <= 50
        BEGIN
            WHILE @draw04 <= 51
            BEGIN
                WHILE @draw05 <= 52
                BEGIN
                    WHILE @draw06 <= 53
                    BEGIN
                        INSERT INTO [dbo].[unique_combinations]
                                    ([draw01]
                                    ,[draw02]
                                    ,[draw03]
                                    ,[draw04]
                                    ,[draw05]
                                    ,[draw06])
                                VALUES
                                    (@draw01
                                    ,@draw02
                                    ,@draw03
                                    ,@draw04
                                    ,@draw05
                                    ,@draw06)

                SET @draw05 = @draw05 + 1
                END 
                SET @start05 += 1
                SET @draw05 = @start05

            SET @draw04 = @draw04 + 1
            END
            SET @start04 = @start04 + 1
            SET @draw04 = @start04

        SET @draw03 = @draw03 + 1
        END
        SET @start03 = @start03 + 1
        SET @draw03 = @start03

    SET @draw02 = @draw02 + 1
    END
    SET @start02 = @start02 + 1
    SET @draw02 = @start02

SET @draw01 = @draw01 + 1
END
SET @start01 = @start01 + 1
SET @draw01 = @start01

Что с этим не так?

Dale K 31.10.2018 02:43

«Очевидно, НИКТО никогда не делал этого раньше, и я абсолютно уникален». - может быть причиной этого .... Какую проблему вы на самом деле пытаетесь решить?

Mitch Wheat 31.10.2018 02:56

если вы хотите иметь хорошую производительность, пожалуйста, не делайте этого. Sql не является языком программирования, данные рассматриваются как единое целое и не взаимодействуют в циклах while или for, таких как python или другие языки программирования.

Alvaro Parra 31.10.2018 02:57

Как увеличивается Draw6?

Sql Surfer 31.10.2018 03:07

Вы намереваетесь удалить дубликаты, в которых одинаковые числа расположены в другом порядке? Например, если одна комбинация (15,16,17,18,19,20), вам также нужна строка для (20,19,18,17,16,15) и (17,19,15, 20,16,18)?

David Dubois 31.10.2018 03:44

1,2,3,4,5,6 1,2,3,4,5,7 ,,, 48,49,50,51,52,53

davlyo 31.10.2018 04:08

@ [Альваро Парра] Вы абсолютно правы. Эти вложенные циклы - построение такого большого набора данных - требуют много работы на SQL Server, особенно на Express, запущенном на моем ноутбуке. Спасибо, что упомянули это -давлё

davlyo 03.11.2018 23:13

Хорошо, я заставил его работать - я не сбрасывал переменные обратно на 1.

davlyo 03.11.2018 23:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
1 090
4

Ответы 4

Сила SQL заключается в том, чтобы делать вещи наборами. Чтобы добиться того, что вы пытаетесь сделать, я бы сделал следующее:

-- house keeping
IF OBJECT_ID( 'tempdb..#numbers' ) IS NOT NULL
BEGIN
    DROP TABLE #numbers;
END;

IF OBJECT_ID( 'tempdb..#unique_combinations' ) IS NOT NULL
BEGIN
    DROP TABLE #unique_combinations;
END;


-- create a table that has the number of numbers we want. I've used 4 just to prove
-- that it works. 53 takes up a massive amount of space and time I don't really have.
-- This is how I go about making tables of numbers. Any method will do, we
-- just want a table with a single column with the number of records we want.

SELECT  TOP (4)
    IDENTITY(INT, 1, 1) AS number
INTO    #numbers
FROM
    sys.objects            s1 
    CROSS JOIN sys.objects s2;  

--Cross join our number table to itself to create the number of required draws.
 SELECT draw1.number AS draw01
      , draw2.number AS draw02
      , draw3.number AS draw03
      , draw4.number AS draw04
      , draw5.number AS draw05
      , draw6.number AS draw06
      INTO  #unique_combinations
FROM
    #numbers            draw1
    CROSS JOIN #numbers draw2
    CROSS JOIN #numbers draw3
    CROSS JOIN #numbers draw4
    CROSS JOIN #numbers draw5
    CROSS JOIN #numbers draw6;

SELECT *  FROM #unique_combinations ;

Мои 4 числа дают мне 4096 строк, что составляет 4 ^ 6, так что я доволен этим. 53 ^ 6 - это 22164361129, что немного больше.

Если ваш вопрос был больше о том, как выполнять циклы while, а не о том, как сгенерировать эти данные, дайте мне знать.

Мой вопрос больше в том, как сделать это, пока выглядит вложенным ... Я могу разобраться с остальным.

davlyo 31.10.2018 03:43

хорошо, скопировал и вставил Код, который вы предоставили мне в своем красноречивом объяснении, вы запускали свой собственный код? Первая строка - 1,1,1,1,1,1; вторая строка - 1,2,1,1,1,1 - ни одна из этих строк не подходит к комбинации. Дайте подумать, как лучше сформулировать свой вопрос ...

davlyo 31.10.2018 04:02

Я запустил его, да. Он будет производить каждую комбинацию для переданного значения. Я не делал никаких заказов, если это проблема? Что именно вам было нужно? Возможно, я неверно истолковал то, что тебе было нужно

LordBaconPants 31.10.2018 04:12

Похоже, вы увеличиваете draw05 вместо draw06 и создаете бесконечный цикл в самом внутреннем блоке WHILE @draw06 <= 53 ...

Но, на первый взгляд, у вас все равно есть почти бесконечный цикл, если вы ожидаете вставить в таблицу от ~ 50 до 6-й степени записей. Это действительно то, что вы пытаетесь сделать?

Мне лень разбираться и отлаживать ваш цикл while.

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

; with num as
(
    select  n = 1 
    union all
    select  n = n + 1
    from    num
    where   n < 53
)
select  *
from    num n1
        cross join num n2
        cross join num n3
        cross join num n4
        cross join num n5
        cross join num n6
where   n1.n    < n2.n
and     n2.n    < n3.n
and     n3.n    < n4.n
and     n4.n    < n5.n
and     n5.n    < n6.n

Это сгенерирует 22 957 480 строк.

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

    WHILE @draw01 <= 48
    BEGIN
        WHIle @draw02 <= 49
        BEGIN
            WHILE @draw03 <= 50
            BEGIN
                WHILE @draw04 <= 51
                BEGIN
                    WHILE @draw05 <= 52
                    BEGIN
                        WHILE @draw06 <= 53
                        BEGIN   
                            INSERT INTO [dbo].[unique_combinations]
                                        ([draw01], [draw02], [draw03], [draw04], [draw05], [draw06])
                                    VALUES
                                        ( @draw01,  @draw02,  @draw03,  @draw04,  @draw05, @draw06)
                        SET @draw06 += 1
                        END
                        SET @draw06 = @draw05 + 2

                    SET @draw05 += 1
                    END
                    SET @draw05 = @draw04 + 1

                SET @draw04 += 1
                END
                SET @draw04 = @draw03 + 1

            SET @draw03 += 1
            END 
            SET @draw03 = @draw02 + 1

        SET @draw02 += 1
        END
        SET @draw02 = @draw01 + 1

    SET @draw01 += 1
    END

Другие вопросы по теме