国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

排列組合的實(shí)現(xiàn)

2024-07-21 02:46:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
排列組合的實(shí)現(xiàn)

數(shù)據(jù)庫(kù)環(huán)境:SQL SERVER2008R2

先說(shuō)一下需求:實(shí)現(xiàn)1,2,3的排列組合,即123,132,213,231,312,321。

哈哈,你沒(méi)看錯(cuò),需求這是這么短短的一句話。

我想到了2個(gè)方法,都可以實(shí)現(xiàn)需求。下面我分別介紹這2種實(shí)現(xiàn)方法。

方法一:建一個(gè)表xx,往xx表中插入1,2,3自然數(shù)列,簡(jiǎn)單起見(jiàn),把自然數(shù)改成字符串,

然后xx表和xx表進(jìn)行FULL JOIN(全外連接)得到結(jié)果集tmp,結(jié)果集tmp再和xx表進(jìn)行LEFT JOIN(左連接),

關(guān)聯(lián)的條件是當(dāng)前xx表的數(shù)據(jù)不存在結(jié)果集tmp中,這個(gè)可以通過(guò)MSSQL內(nèi)置函數(shù)CHARINDEX實(shí)現(xiàn)。

/*數(shù)據(jù)準(zhǔn)備*/WITH    x0          AS ( SELECT   '1' AS hid               UNION ALL               SELECT   '2' AS hid               UNION ALL               SELECT   '3' AS hid               --UNION ALL               --SELECT   '4' AS hid             )    /*計(jì)算、輸出*/SELECT  a.hid + b.hid AS hidFROM    ( SELECT    a.hid + b.hid AS hid          FROM      x0 a                    FULL JOIN x0 b ON b.hid <> a.hid        ) a        LEFT JOIN x0 b ON CHARINDEX(b.hid, a.hid, 1) = 0ORDER BY 1

方法一看起來(lái)簡(jiǎn)單明了,用不著再解釋了。現(xiàn)在我們來(lái)看一下方法二的實(shí)現(xiàn):

通過(guò)CTE實(shí)現(xiàn)遞歸,把1,2,3的所有組合都枚舉,最后在外層把字符串長(zhǎng)度為3的組合給過(guò)濾出來(lái)即可。

/*數(shù)據(jù)準(zhǔn)備*/    WITH    x0          AS ( SELECT   CONVERT(VARCHAR(10),1) AS hid               UNION ALL               SELECT   CONVERT(VARCHAR(10),2) AS hid               UNION ALL               SELECT   CONVERT(VARCHAR(10),3) AS hid               --UNION ALL               --SELECT   CONVERT(VARCHAR(10),4) AS hid             )SELECT * INTO xx FROM x0WITH    x1          AS ( SELECT   hid               FROM     xx               WHERE    LEN(hid) <= 3               UNION ALL               SELECT   CONVERT(VARCHAR(10), a.hid + b.hid) AS hid               FROM     xx a                        INNER JOIN x1 b ON CHARINDEX(a.hid, b.hid, 1) = 0             )    SELECT  *    FROM    x1    WHERE   LEN(hid) = 3    ORDER BY hid

好了,方法二也實(shí)現(xiàn)了。這里要注意一點(diǎn),就是插入xx表要指定數(shù)據(jù)類型及長(zhǎng)度,在拼接的時(shí)候,也要轉(zhuǎn)換一下格式。不然,

會(huì)提示“類型不匹配”錯(cuò)誤。

OK,我把結(jié)果貼一下。

現(xiàn)在簡(jiǎn)單總結(jié)一下這2種實(shí)現(xiàn)方法,方法一技巧性比較強(qiáng),也很簡(jiǎn)單,容易理解,缺點(diǎn)是如果要增加到4位數(shù),那么,就要在外面多套一些循環(huán)。

方法二用到了遞歸,理解起來(lái)有點(diǎn)困難,但相對(duì)于方法一更靈活,如果增加到更多的數(shù),只需改一下代碼中相應(yīng)的數(shù)字即可。

(本文完)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 北海市| 南漳县| 临夏县| 广灵县| 大关县| 佛冈县| 锡林浩特市| 新民市| 古浪县| 循化| 桑植县| 清徐县| 沧州市| 平和县| 原阳县| 满城县| 乐陵市| 吉林省| 保定市| 遂昌县| 仪陇县| 长治市| 漳平市| 安仁县| 阆中市| 四川省| 乐东| 河北省| 巴彦淖尔市| 深圳市| 师宗县| 柯坪县| 天峨县| 淅川县| 西盟| 易门县| 南部县| 剑阁县| 惠东县| 聂拉木县| 榆社县|