SQL生成一柱双色球

数据库环境:SQL SERVER 2005

以前用C/JAVA穷举双色球的所有排列,今天想着换成用SQL实现,只生成一柱双色球。

简单说下双色球的规则,双色球由红色球和蓝色球组成,每注投注号码由6个红色球号码和1个蓝色球号码组成。

红色球号码从1--33中选择;蓝色球号码从1--16中选择。同时,一柱号码中,蓝色球不能出现在红色球里。

规则讲完了,我们来看实现,直接上代码,代码里有注释,应该都能看懂

/*生成1-33个号码的球*/
WITH    x0
          AS ( SELECT   number AS ball
               FROM     master.dbo.spt_values
               WHERE    type = ‘P‘
                        AND number <= 33
                        AND number >= 1
             ),/*随机生成6个红色球*/
        x1
          AS ( SELECT TOP 6
                        ball
               FROM     x0
               ORDER BY NEWID()
             )
    SELECT  redball AS 红色球 ,
            ( /*生成蓝色球*/ SELECT TOP 1
                                ball
                        FROM    x0
                        WHERE   ball <= 16
                                AND ball NOT IN ( SELECT    ball
                                                  FROM      x1 )
                        ORDER BY NEWID()
            ) AS 蓝色球
    FROM    ( /*将红色球排到一行*/ SELECT   REPLACE(( SELECT    CAST(ball AS VARCHAR)
                                                        + ‘,‘
                                              FROM      x1
                                            FOR
                                              XML PATH(‘‘)
                                            ), ‘,‘, ‘ ‘) AS redball
            ) t

这样就实现了吗???

没有!!!

这里挖了一个坑,我们先看下意外的结果

蓝色球和红色球出现重号

问题就出现在我用cte生成随机的6个红色球,每次调用x1的时候,这6个数都会随机生成,所以,才会出现这样的结果。

问题已经查明了,我们把6个红色球存到临时表里头,就不会每次调用的时候会发生改变。

更改后的SQL如下:

/*生成1-33号码的球*/
SELECT  number AS ball
INTO    #t0
FROM    master.dbo.spt_values
WHERE   type = ‘P‘
        AND number <= 33
        AND number >= 1
/*生成6个红色球*/
SELECT TOP 6
        ball
INTO    #t1
FROM    #t0
ORDER BY NEWID()

SELECT  redball AS 红色球 ,
        ( /*生成蓝色球*/ SELECT TOP 1
                            ball
                    FROM    #t0
                    WHERE   ball <= 16
                            AND ball NOT IN ( SELECT    ball
                                              FROM      #t1 )
                    ORDER BY NEWID()
        ) AS 蓝色球
FROM    ( /*将红色球排到一行*/ SELECT   REPLACE(( SELECT    CAST(ball AS VARCHAR)
                                                    + ‘,‘
                                          FROM      #t1
                                        FOR
                                          XML PATH(‘‘)
                                        ), ‘,‘, ‘ ‘) AS redball
        ) t
时间: 2024-12-12 09:48:52

SQL生成一柱双色球的相关文章

SQL生成包含年与日的流水号

--************************************************************************************************************* DECLARE @I INT, @YMD VARCHAR(6) SELECT @I=1 SELECT @YMD=convert(char (6), getdate(), 12) WHILE @I<=100 BEGIN INSERT INTO tb2 VALUES('V'+@Y

SQL生成规则数

--------------------------开始----------------------------开始值DECLARE @start INT = 1--结束值DECLARE @end INT = 1000--长度DECLARE @length INT = LEN(@end)--前缀DECLARE @prefix VARCHAR(50) = '0990';--后缀DECLARE @suffix VARCHAR(50) = '';----------------------------

模拟双色球彩票开奖结果:随机生成一注双色球彩票.......

模拟双色球彩票开奖结果:随机生成一注双色球彩票,判断其是否中奖,奖金为多少.一注双色球彩票由6个不重复的红球(序号:1~32)和1个篮球(序号:1~16)构成.双色球中奖规则如下: (提示:① 随机数:java.util.Random中的Random类有一个方法int nextInt(int n)可以生成0~n的一个随机整数.(教材P202页)② java.util.Arrays的常用方法:Arrays.sort(a); //将数组a中的元素按升序排列:Arrays.binarySearch(a

SQL 生成一个日期范围

有时想按日或月生成一个序列,就像2014-1-1.2014-1-2.2014-1-3... 在sql server中可以写个函数来实现. /* 生成一个日期范围,如2014.01.2014.02... @Increment 步进值 @StartDate 开始日期 @EndDate 结束日期 ---------------------- @SelectedRange 返回值名称(多语句表值函数的返回值必须存放在返回值变量中) 返回表的字段和类型: iDate DATETIME, iYear cha

使用sql生成UUID

在SQLServer中使用该sql语句可以生成GUID:select cast(NEWID() as varchar(36)) as uuid 通过一下语句将GUID中的'-'字符去掉: select SUBSTRING(uuid,1,8)+SUBSTRING(uuid,10,4)+SUBSTRING(uuid,15,4)+ SUBSTRING(uuid,20,4)+SUBSTRING(uuid,25,12) from (select cast(NEWID() as varchar(36)) a

SQL生成一年每一天的时间列表的几种方法

工作好几年了,一直没有写博客,准备捡起来... 以下脚本适用环境:SQL SERVER (starting with 2012) 1.构建序列: /*1-1:利用交叉连接,推荐下列这种写法*/ SELECT /*2012 开始已支持OFFSET 语法,不再推荐使用TOP N */ s1.i + s2.i + s3.i + s4.i + s5.i + s6.i + s7.i + s8.i + s9.i AS seq FROM ( SELECT i = 0 UNION ALL SELECT i =

在powerDesigner中通过SQL生成pdm

在项目需求分析的阶段,通常需要画数据库表的pdm图.有时候会直接画pdm来设计表,有时候是通过其他方式,如用纸和笔去画……当数据库中的表已经建立好了,怎么把数据库中的表导成SQL形式,然后生成pdm图呢? 数据库:oracle.数据库工具:dbVisual ①在dbVisual中可以连接各种数据库,这里连接oracle数据库,用的也是dbVisual.在dbVisual中,ctrl选择多个要生成pdm的表,右击,导出SQL形式,生成导出的SQL文件. ②打开powerDesigner, File

mysql 动态sql 生成测试数据

#create testtable CREATE TABLE `testtable` (   `id` int(11) NOT NULL,   `createdTime` datetime DEFAULT NULL,   `login` text,   `testid` varchar(63) DEFAULT NULL,   PRIMARY KEY (`id`) ) PARTITION BY RANGE (TO_DAYS(createdTime)) (   PARTITION p01 VALUE

.net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类

在开发中可能会遇到这几种情况 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要先建一个类 ,头痛 4.如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类 为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用 封装类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25