Несколько T-SQL, вложенных во время циклов - PullRequest
0 голосов
/ 31 октября 2018

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

TIA -давлё

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

Ответы [ 4 ]

0 голосов
/ 04 ноября 2018

Решил эту проблему - я не сбрасывал переменные отрисовки обратно на 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
0 голосов
/ 31 октября 2018

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

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

0 голосов
/ 31 октября 2018

Мне лень понимать и отлаживать твой цикл 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 строк.

0 голосов
/ 31 октября 2018

Сила 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, а не как генерировать эти данные, пожалуйста, дайте мне знать.

...