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 ...
随机推荐
- python 实现对象模型
# -*- coding:utf-8 -*- """ python 实现对象模型 创建 bmicalcpage 类 """ class bm ...
- EF多表查询方式
5, 连接 可以的连接有Join 和 GroupJoin 方法.GroupJoin组联接等效于左外部联接,它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素). using (var ...
- Web---演示Servlet的相关类、下载技术、线程问题、自定义404页面
Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的 ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6321 Solved: 2628[Su ...
- ubuntu64bits环境下搭建Opencl的环境
此文介绍 ubuntu 平台下配置 AMD/ATI Opencl 环境,我是ubuntu 12.04. 主要分为六个步骤: 1. Take a look at your hardware to mak ...
- How I Mathematician Wonder What You Are! - POJ 3130(求多边形的核)
题目大意:判断多多边形是否存在内核. 代码如下: #include<iostream> #include<string.h> #include<stdio.h> # ...
- php 生成mysql数据字典代码
由于项目开发用了比较多的表 ,为了快速获取数据字典,通过php代码的方式来获取表结构和表注释.代码如下: <?php /** * 生成mysql数据字典 */ header ( "Co ...
- 【转】G40-70、G50-70联想小新笔记本SR1000随机Linux改Windows 7系统操作指导
http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20140505150749705.html 适用范围:G40-70,G50-70联想小新笔 ...
- Android 系统名字、版本、API level的对应关系
从官网上找到的,具体地址是: http://source.android.com/source/build-numbers.html Code name Version API level Lolli ...
- win10常见问题-任务栏消失
问题描写叙述: O疼地尝鲜了win10,bug层出不穷,眼下遇到的最大的两个BUG是: 1.启动后高概率出现黑屏,仅仅有鼠标,无桌面,无法拯救 2.正常执行高概率出现任务栏丢失现象.无法拯救 问题一, ...