Sql server 多个T-SQL嵌套While循环
此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个了。 请看一下这段代码,告诉我我错过了什么 蒂亚-达夫利奥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
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-这两条线都不接近组合。让我想想如何更好地表达我的问题……是的,我确实运行了它。它将为传入的值生成每个组合。我没有做任何订购,如果这是问题的话?你到底想要什么?我可能误解了你的意思