數(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ù)字即可。
(本文完)
新聞熱點(diǎn)
疑難解答
圖片精選