Sql server 多个T-SQL嵌套While循环

Sql server 多个T-SQL嵌套While循环,sql-server,tsql,while-loop,sql-server-2014-express,Sql Server,Tsql,While Loop,Sql Server 2014 Express,此T-SQL旨在将抽签6,1-53的所有可能值写入表[dbo].[unique_compositions]。从1,2,3,4,5,6开始;1,2,3,4,5,7... 但它将只生成最后两列draw05和draw06。显然,以前没有人这样做过,我是独一无二的。我甚至找不到3个嵌套While循环语句的示例,更不用说6个了。 请看一下这段代码,告诉我我错过了什么 蒂亚-达夫利奥 DECLARE @start01 AS INT = 1 DECLARE @start02 AS INT = 2 DECLAR

此T-SQL旨在将抽签6,1-53的所有可能值写入表[dbo].[unique_compositions]。从1,2,3,4,5,6开始;1,2,3,4,5,7... 但它将只生成最后两列draw05和draw06。显然,以前没有人这样做过,我是独一无二的。我甚至找不到3个嵌套While循环语句的示例,更不用说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

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循环而不是如何生成数据,那么请告诉我。

看起来你是在增加draw05而不是draw06,并在你最深处创建一个无限循环,而@draw06我太懒了,无法理解和调试你的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

这将生成22957480行。

解决了这个问题-我没有将draw变量重置回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

有什么问题吗?显然以前没有人这样做过,我是独一无二的。-这可能是一个原因…你到底想解决什么问题?如果你想有一个好的表现,请不要这样做。Sql不是一种编程语言,数据被视为一个整体,不会在python或其他编程语言等循环中交互。Draw6是否会递增?您是否打算消除相同数字顺序不同的重复项?例如,如果一个组合是15,16,17,18,19,20,您是否还希望为20,19,18,17,16,15和17,19,15,20,16,18创建一行?我的问题更多的是如何执行while。。。我能猜出剩下的。好的,复制并粘贴了你在雄辩的解释中提供给我的代码,你运行自己的代码了吗?第一行是1,1,1,1,1,1;第二条线是1,2,1,1,1,1-这两条线都不接近组合。让我想想如何更好地表达我的问题……是的,我确实运行了它。它将为传入的值生成每个组合。我没有做任何订购,如果这是问题的话?你到底想要什么?我可能误解了你的意思