1. 程式人生 > >[整理]列舉雙色球的紅球所有排列組合的SQL

[整理]列舉雙色球的紅球所有排列組合的SQL

由數學上的排列組合可以計算出來,由於雙色球不排序,只組合,所以33紅球和16籃球全選的話有   17721088種可能。

--電腦很慢,用了3:46"
;WITH CTE AS
(
SELECT TOP 33 ID=ROW_NUMBER() OVER (ORDER BY GETDATE()) FROM syscolumns
)
,CTE2 AS
(
SELECT ID,CAST(ID AS VARCHAR(8000)) AS COP,LVL=1 FROM CTE
UNION ALL
SELECT CTE.ID,COP=COP+','+RTRIM(CTE.ID),LVL+1 FROM CTE,CTE2 WHERE CTE.ID<CTE2.ID AND LVL<6
)
SELECT ROW_NUMBER() OVER (ORDER BY GETDATE()),COP FROM CTE2 WHERE LVL=6
/*
                     COP
-------------------- ---------------------------------------------------------
1                    33,32,31,30,29,1
2                    33,32,31,30,29,2
3                    33,32,31,30,29,3
4                    33,32,31,30,29,4
5                    33,32,31,30,29,5
6                    33,32,31,30,29,6
..........
1107564              7,6,5,4,2,1
1107565              7,6,5,3,2,1
1107566              7,6,4,3,2,1
1107567              7,5,4,3,2,1
1107568              6,5,4,3,2,1


(1107568 row(s) affected)
*/

【SQLServer】

SELECT TOP 33 id=identity(int,1,1) INTO #1 FROM sysobjects

SELECT A.id ,B.id,C.id,D.id,E.id,F.id 
FROM #1 A,#1 B,#1 C,#1 D,#1 E,#1 F
WHERE A.ID<B.ID AND A.ID<C.ID AND A.ID<D.ID AND A.ID<E.ID AND A.ID<F.ID
AND B.ID<C.ID AND B.ID<D.ID AND B.ID<E.ID AND B.ID<F.ID
AND C.ID<D.ID AND C.ID<E.ID AND C.ID<F.ID
AND D.ID<E.ID AND D.ID<F.ID
AND E.ID<F.ID
ORDER BY A.id,B.id,C.id,D.id,E.id,F.id

--result : 1107568 SQL Server 2005 46's

-- 建立號碼錶(1-33)tb_rednum

SELECT TOP 33 id=identity(int,1,1) INTO dbo.tb_rednum FROM sysobjects

-- 建立結果表 (所有組合) tb_allred

SELECT A.id num01 ,B.id num02,C.id num03,D.id num04,E.id num05,F.id num06 into dbo.tb_allred

FROM tb_rednum A,tb_rednum B,tb_rednum C,tb_rednum D,tb_rednum E,tb_rednum F
WHERE A.ID<B.ID AND A.ID<C.ID AND A.ID<D.ID AND A.ID<E.ID AND A.ID<F.ID
AND B.ID<C.ID AND B.ID<D.ID AND B.ID<E.ID AND B.ID<F.ID
AND C.ID<D.ID AND C.ID<E.ID AND C.ID<F.ID
AND D.ID<E.ID AND D.ID<F.ID
AND E.ID<F.ID

引自:http://blog.csdn.net/flyloafer/article/details/5221137     徐哲

【Oracle】

With X As (Select Rownum Id From Dict Where Rownum<33)
Select A.Id R1,B.Id R2,C.Id R3,D.Id R4,E.Id R5,F.Id R6
From X A,X B,X C,X D,X E,X F
Where A.Id<B.Id And A.Id<C.Id And A.Id<D.Id And A.Id<E.Id And A.Id<F.Id
And B.Id<C.Id And B.Id<D.Id And B.Id<E.Id And B.Id<F.Id
And C.Id<D.Id And C.Id<E.Id And C.Id<F.Id
And D.Id<E.Id And D.Id<F.Id
And E.Id<F.Id
Order By A.Id,B.Id,C.Id,D.Id,E.Id,F.Id;

 雙色球彩票33選6演算法:M個數N個為一組,所有無重複的排列組合

 應朋友請求做的雙色球彩票33選6演算法:M個數N個為一組,所有無重複的排列組合。測試基本沒問題,歡迎彩票迷們使用!

   private void button1_Click(object sender, EventArgs e)
        {
            int nCnt = 0;
            List<int> nNumList = new List<int>();
            for (int i = 0; i < cblNumList.Items.Count; i++)
            {
                if (cblNumList.GetItemChecked(i))
                {
                    nNumList.Add(Convert.ToInt32(cblNumList.Items[i].ToString()));
                }
            }
            System.Text.StringBuilder sbResult = new StringBuilder();

            int nLast = nNumList.Count;

            for (int i1 = 0; i1 < nLast-5; i1++)
            {
                for (int i2 = 0; i2 < nLast - 4; i2++)
                {
                    if (i2 == i1) continue;
                    for (int i3 = 0; i3 < nLast - 3; i3++)
                    {
                        if (i3 == i2 || i3 == i1) continue;
                        for (int i4 = 0; i4 < nLast - 2; i4++)
                        {
                            if (i4 == i3 || i4 == i2 || i4 == i1) continue;
                            for (int i5 = 0; i5 < nLast - 1; i5++)
                            {
                                if (i5 == i4 || i5 == i3 || i5 == i2 || i5 == i1) continue;
                                for (int i6 = 0; i6 < nLast; i6++)
                                {
                                    if (i6 == i5 || i6 == i4 || i6 == i3 || i6 == i2 || i6 == i1) continue;
                                    if (nNumList[i1] > nNumList[i2] || nNumList[i2] > nNumList[i3] || nNumList[i3] > nNumList[i4] || nNumList[i4] > nNumList[i5] || nNumList[i5] > nNumList[i6]) continue;
                                    sbResult.Append("\r\n" + nNumList[i1].ToString() + " " + nNumList[i2].ToString() + " " + nNumList[i3].ToString() + " " + nNumList[i4].ToString() + " " + nNumList[i5].ToString() + " " + nNumList[i6].ToString());
                                    nCnt += 1;
                                }
                            }
                        }
                    }
                }
            }
            tbResult.Text = sbResult.ToString();
            //lblMessage.Text = nLast + " 個隨機數字;共有 " + nCnt + " 條記錄";

        }