数据库环境: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

这样就实现了吗???

没有!!!

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

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAALUAAAAuCAIAAADhkM9+AAADoklEQVR4nO2az2rbQBDG551iG9p3EUaH+EEMhpxKHyGHEhDdngJ5Bh8MuhZ6btElYPtqQ3qQLa129p/tHWukzMdgxK60kmZ++2WlCD6GJqXUv5Cen388PCxwBA9MIqXUdiyCvst9sZRSf3lL+OhTSnRHDY8P0T114uPnr1cJCRwtH0dKVbsD6fhDFM+cVLuD3T+oz0o6/hDFMyfCBxfxzAkvPgAg5vDI3Yz9Lz3qzorPifVGiHLClA/oytgHy9prHTbxnaQTzon1ToN3nTYnjPiImSiRUwcjdfEl3l1X+wdpTrjwYcX5ukQcNfP0zCpu8qw/PHOdOieM+MDXak1H0GzxgZyxaOTxVJ0PfMukOeHCR60YPvzbRnb0SZPiwgkV5MPlIqQ5YcSHnwbc4trGXUZqeCrGP4z2+G3cFZkTLnxYXdGal0u9dBBwHG94/0GaEy58WBXjKP4Drf7MUy7/CNaeNCe8+IjxD9eYLv88otTwlP9vrlHOSD5uzwkXPrAfHq/iI3IchqLj45accOFDV9BOg5aLR0t8AwRK/v40SU448vE5xTMnwgcX8cyJk49qd5CQqFx8kH8JDSC/xi9DfXTV4YPOtbbbbfW+l9ADgN3H4X3yAQC9l4RV4GL0LvEPRiH+0eFD/MOI0fjH6yM83vj4G/IPlUH+Emjxdb3MYbIqzT2L/PTOaK4qtH+trDBb8M7r1azuwafAR+GRXRHyj7cFLN4CLYl1KR+/v32pbzYBHw7/KJfT+hRNyXGLZ+d99b6vNk8TS/FUdi6SSU+Rw/RpraO2eZqcWsrldLbcGIPXp1MZdLrWq9kZi3I5haywjXyNf/z5/rW+zYYG3EKiUfpHuZzOsvnM5KMtlSfONBS5bgCdqd+ig7q6HtO9AMTZGP0jJR/e9ccNfBQ5zBUqjz653XH2Bv1wd6U9l3T2D4vrXOEftT4ZHzT+cdq28jGZ5xPHkqI6ryrqonr5OP39AnD6wXo1071KH1n8I5YPCv9oamn3j3ZJ4arWqcvHh2dpYoPD6SjiH34+CPyjWa6C5fmiyH2WoNvMqvSsP/zW4oAjcFLxDwsfVOsPZzE6GBklN587PCbRrnORJRS58SRlGVn8I5IPAv8ITdaI9x/NUZ73H66utl0bCo88ev9IIHl/imM070/T8NF7PbiF/P+lw4f4hxHiHx0+eq8Htxief9B9sib+gWN4/kEtYPBJH7dfVsLEtHyQgikaqIQPkU/Ch8in/5URsT/w3m+ZAAAAAElFTkSuQmCC" alt="" />

蓝色球和红色球出现重号

问题就出现在我用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

经网友Yuanet在评论中提醒,双色球的规则,蓝色球是可以出现在红色球中的。

因此,我对原来的代码做一些改动,使计算结果符合双色球的规则。

/*生成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 红色球 ,
CAST(RAND()*16+1 AS INT) AS 蓝色球
FROM ( /*将红色球排到一行*/ SELECT REPLACE(( SELECT CAST(ball AS VARCHAR)
+ ','
FROM x1
FOR
XML PATH('')
), ',', ' ') AS redball
) t

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

  1. c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”

    ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述     相关代码 using System; us ...

  2. 重构 ORM 中的 Sql 生成

    Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成   前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 OR ...

  3. 一条SQL生成数据字典

    有个字典表并定期维护,对DBA和开发很重要,终于把他们整合在一起了,看有没问题? 一条SQL生成数据字典,包含所有OPEN用户.表名.字段名.字段序号.字段属性.默认值.是否非空.字段意思.主键标识. ...

  4. 对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成

    大家知道,DataSet保存的数据是位于服务器内存里面的原数据库的“副本”.所以用DataSet更新数据的过程就是先对“副本”进行更新,然后 在将“原本”更新,按照我的理解就是把“原本”覆盖掉.具体到 ...

  5. 查看Linq to Sql生成的sql语句(转)

    查看Linq to Sql生成的sql语句   在控制台项目中,比较简单,直接db.Log = Console.Out;就OK了 但是在其他项目中,需要处理如下: StreamWriter sw = ...

  6. PHP通过sql生成CSV文件并下载,PHP实现文件下载

    /** * PHP通过sql生成CSV文件并下载 * @param string $sql 查询sql,结果为二维数组 * @param array $title 数据,CSV文件标题 * @para ...

  7. Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成

    前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...

  8. 使用SQL生成DateTime.Ticks

    在项目中我需要使用到一个随机数(Random Number),该随机数将作为 Hashtable 中的 Key 用于唯一索引数据,所以需要保持单机唯一性. 同时该随机数还需要具备可排序性以便对数据进行 ...

  9. oracle:如何用sql生成日历

    BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下: create table T_BAS_CALENDAR ( d_year ) no ...

随机推荐

  1. 如何编译Support7Demos测试appcompat

    目录(?)[-] 简介 在Eclipse中编译 使用Gradle编译 简介 Google发布的API-18中带上的support-v7包含了appcompat组件,可以在小于API-11的androi ...

  2. handlebars模板库的资源

    web 开发中,js 解析JSON 是经常的事情.非常繁琐.handlebars 使用了模版,只要你定义一个模版,提供一个json对象,handlebars 就能吧json对象放到你定的模版中,非常方 ...

  3. (转载)TRS的WCM6漏洞权限绕过以及绕过密码的登陆方式

    转载于:http://www.2cto.com/Article/201302/191261.html 1.由来:建立在 TRS的WCM6可直接获取管理员密码 漏洞的基础上   2.首先访问wcm目录, ...

  4. octopress Endless Error With Gem Dependencies

    因为重装系统的缘故,需要重新搭建octopress环境,在执行到: bundle install 会出现一些这样的错误:An error occurred while installing timer ...

  5. How to create XML validator(验证器;验证程序) from XML schema

    In order to check XML data for validity we have to prepare its schema XSD-file. This file will be lo ...

  6. SpringMVC 测试 mockMVC

    SpringMVC测试框架 基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试. 一 MockMvcBui ...

  7. jOOQ

    jOOQ http://www.jooq.org/ jOOQ是个更不错的SQL解决方案. 你可以在Java中以一种类型安全的方式来书写SQL语句: // Typesafely execute the ...

  8. hadoop启动后jps查不到namenode的解决办法

    最近由于项目需要开始接触hadoop,在配置伪分布式启动后,jps查询进程发现少了namenode,而DataNode却存在. 下面是我的core-site.xml和hdfs-site.xml配置: ...

  9. HDU 2876 Ellipse, again and again

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php ...

  10. hdu 2821 Pusher(dfs)

    Problem Description PusherBoy is an online game http://www.hacker.org/push . There is an R * C grid, ...