Этот 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
«Очевидно, НИКТО никогда не делал этого раньше, и я абсолютно уникален». - может быть причиной этого .... Какую проблему вы на самом деле пытаетесь решить?
если вы хотите иметь хорошую производительность, пожалуйста, не делайте этого. Sql не является языком программирования, данные рассматриваются как единое целое и не взаимодействуют в циклах while или for, таких как python или другие языки программирования.
Как увеличивается Draw6?
Вы намереваетесь удалить дубликаты, в которых одинаковые числа расположены в другом порядке? Например, если одна комбинация (15,16,17,18,19,20), вам также нужна строка для (20,19,18,17,16,15) и (17,19,15, 20,16,18)?
1,2,3,4,5,6 1,2,3,4,5,7 ,,, 48,49,50,51,52,53
@ [Альваро Парра] Вы абсолютно правы. Эти вложенные циклы - построение такого большого набора данных - требуют много работы на SQL Server, особенно на Express, запущенном на моем ноутбуке. Спасибо, что упомянули это -давлё
Хорошо, я заставил его работать - я не сбрасывал переменные обратно на 1.
Сила 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, а не о том, как сгенерировать эти данные, дайте мне знать.
Мой вопрос больше в том, как сделать это, пока выглядит вложенным ... Я могу разобраться с остальным.
хорошо, скопировал и вставил Код, который вы предоставили мне в своем красноречивом объяснении, вы запускали свой собственный код? Первая строка - 1,1,1,1,1,1; вторая строка - 1,2,1,1,1,1 - ни одна из этих строк не подходит к комбинации. Дайте подумать, как лучше сформулировать свой вопрос ...
Я запустил его, да. Он будет производить каждую комбинацию для переданного значения. Я не делал никаких заказов, если это проблема? Что именно вам было нужно? Возможно, я неверно истолковал то, что тебе было нужно
Похоже, вы увеличиваете 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
Что с этим не так?