數據庫環境: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
這樣就實現了嗎???
沒有?。。?/p>
這里挖了一個坑,我們先看下意外的結果
藍色球和紅色球出現重號
問題就出現在我用cte生成隨機的6個紅色球,每次調用x1的時候,這6個數都會隨機生成,所以,才會出現這樣的結果。
問題已經查明了,我們把6個紅色球存到臨時表里頭,就不會每次調用的時候會發生改變。
更改后的SQL如下:
/*生成1-33號碼的球*/SELECT number AS ballINTO #t0FROM master.dbo.spt_valuesWHERE type = 'P' AND number <= 33 AND number >= 1/*生成6個紅色球*/ SELECT TOP 6 ballINTO #t1FROM #t0ORDER 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
新聞熱點
疑難解答