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
这样就实现了吗???
没有!!!
这里挖了一个坑,我们先看下意外的结果
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生成一柱双色球的更多相关文章
- c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”
ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述 相关代码 using System; us ...
- 重构 ORM 中的 Sql 生成
Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成 前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 OR ...
- 一条SQL生成数据字典
有个字典表并定期维护,对DBA和开发很重要,终于把他们整合在一起了,看有没问题? 一条SQL生成数据字典,包含所有OPEN用户.表名.字段名.字段序号.字段属性.默认值.是否非空.字段意思.主键标识. ...
- 对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成
大家知道,DataSet保存的数据是位于服务器内存里面的原数据库的“副本”.所以用DataSet更新数据的过程就是先对“副本”进行更新,然后 在将“原本”更新,按照我的理解就是把“原本”覆盖掉.具体到 ...
- 查看Linq to Sql生成的sql语句(转)
查看Linq to Sql生成的sql语句 在控制台项目中,比较简单,直接db.Log = Console.Out;就OK了 但是在其他项目中,需要处理如下: StreamWriter sw = ...
- PHP通过sql生成CSV文件并下载,PHP实现文件下载
/** * PHP通过sql生成CSV文件并下载 * @param string $sql 查询sql,结果为二维数组 * @param array $title 数据,CSV文件标题 * @para ...
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...
- 使用SQL生成DateTime.Ticks
在项目中我需要使用到一个随机数(Random Number),该随机数将作为 Hashtable 中的 Key 用于唯一索引数据,所以需要保持单机唯一性. 同时该随机数还需要具备可排序性以便对数据进行 ...
- oracle:如何用sql生成日历
BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下: create table T_BAS_CALENDAR ( d_year ) no ...
随机推荐
- [PeterDLax著泛函分析习题参考解答]第2章 线性映射
1. 验证两个线性映射的复合仍是线性映射而且满足分配律: $$\bex {\bf M}({\bf N}+{\bf K})={\bf M}{\bf N}+{\bf M}{\bf K},\quad ({\ ...
- 作品第二课----点击DIV显示其内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- android camera(三):camera V4L2 FIMC
1. V4L2 1)简介 在Linux中,摄像头方面的标准化程度比较高,这个标准就是V4L2驱动程序,这也是业界比较公认的方式. V4L全称是Video for Linux,是Linux内核中标准的关 ...
- JAVA基础英语单词表(中)
factory / 'fæktəri / 工厂 fetch ...
- OGG 单表初始化操作步骤
有时候ogg两端数据不一致,且数据量较大,手工修改比较复杂的情况下,我们需要对这些表进行初始化.初始化的大概思路是: 1. 停止两端OGG 2. 如果业务不可以停很长时间,就需要配置目标端进程,暂停这 ...
- PAT 1012. The Best Rank
To evaluate the performance of our first year CS majored students, we consider their grades of three ...
- 安装MYSQL 出现Error 1045 access denied 的解决方法
操作系统:WINDOWS10 系统 数据库版本:mysql 5.x 提示:access denied for user 'root'@'localhost' using password yes/no ...
- backpropagate
http://blog.csdn.net/celerychen2009/article/details/8964753
- mysql加入�管理员
1.首先用超级管理员登录,然后点击权限button 2.点击加入�新用户,填写登录名和password,全局权限不用选,点击新建用户button 3.编辑新加入�的用户(编辑权限) 4.找到" ...
- 使用java进行文件编码转换
在开发过程中,可能会遇到文件编码的转换,尽管说开发工具eclipse能够转换编码,可是有的情况却非常不方便.比方,原来文件本身的编码是GBK,如今要转换成UTF-8,假设直接在eclipse中把文件编 ...