I am a beginner with SQL and I was looking for more experiences with SQL hence I decided to design a procedure to generate X amount of random lotto picks. The lottery here in my area allows you to pick 5 numbers from 1-47 and 1 "mega" number from 1-27. The trick is the "mega" number could repeat with the 5 numbers previously, i.e. 1, 2, 3, 4, 5, mega 1.
I created the following procedure to generate 10 million lottery picks, and it took 12 hours and 57 minutes for the process to finish. While my friends tested the same thing with java and it took seconds. I was wondering if there's any improvements I can make to the code or if there's any mistakes that I've made? I'm new at this hence I am trying to learn better approaches etc, all comments welcome.
USE lotto
DECLARE
@counter INT,
@counter1 INT,
@pm SMALLINT,
@i1 SMALLINT,
@i2 SMALLINT,
@i3 SMALLINT,
@i4 SMALLINT,
@i5 SMALLINT,
@sort int
SET @counter1=0
TRUNCATE TABLE picks
WHILE @counter1<10000000
BEGIN
TRUNCATE TABLE sort
SET @counter = 1
WHILE @counter < 6
BEGIN
INSERT INTO sort (pick)
SELECT CAST(((47+ 1) - 0) * RAND() + 1 AS TINYINT)
IF (SELECT count(distinct pick) FROM sort)<@counter
BEGIN
TRUNCATE TABLE sort
SET @counter=1
END
ELSE IF (SELECT COUNT(DISTINCT pick) FROM sort)=@counter
BEGIN
SET @counter = @counter + 1
END
END
SET @sort = 0
WHILE @sort<5
BEGIN
UPDATE sort
SET sort=@sort
WHERE pick = (SELECT min(pick) FROM sort WHERE sort is null)
SET @sort=@sort + 1
END
SET @i1 = (SELECT pick FROM sort WHERE sort = 0)
SET @i2 = (SELECT pick FROM sort WHERE sort = 1)
SET @i3 = (SELECT pick FROM sort WHERE sort = 2)
SET @i4 = (SELECT pick FROM sort WHERE sort = 3)
SET @i5 = (SELECT pick FROM sort WHERE sort = 4)
SET @pm = (CAST(((27+ 1) - 0) * RAND() + 1 AS TINYINT))
INSERT INTO picks(
First,
Second,
Third,
Fourth,
Fifth,
Mega,
Sequence
)
Values(
@i1,
@i2,
@i3,
@i4,
@i5,
@pm,
@counter1
)
SET @counter1 = @counter1+1
END