數據庫環境:SQL SERVER2008R2
先說一下需求:實現1,2,3的排列組合,即123,132,213,231,312,321。
哈哈,你沒看錯,需求這是這么短短的一句話。
我想到了2個方法,都可以實現需求。下面我分別介紹這2種實現方法。
方法一:建一個表xx,往xx表中插入1,2,3自然數列,簡單起見,把自然數改成字符串,
然后xx表和xx表進行FULL JOIN(全外連接)得到結果集tmp,結果集tmp再和xx表進行LEFT JOIN(左連接),
關聯的條件是當前xx表的數據不存在結果集tmp中,這個可以通過MSSQL內置函數CHARINDEX實現。
/*數據準備*/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 ) /*計算、輸出*/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
方法一看起來簡單明了,用不著再解釋了?,F在我們來看一下方法二的實現:
通過CTE實現遞歸,把1,2,3的所有組合都枚舉,最后在外層把字符串長度為3的組合給過濾出來即可。
/*數據準備*/ 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
好了,方法二也實現了。這里要注意一點,就是插入xx表要指定數據類型及長度,在拼接的時候,也要轉換一下格式。不然,
會提示“類型不匹配”錯誤。
OK,我把結果貼一下。
現在簡單總結一下這2種實現方法,方法一技巧性比較強,也很簡單,容易理解,缺點是如果要增加到4位數,那么,就要在外面多套一些循環。
方法二用到了遞歸,理解起來有點困難,但相對于方法一更靈活,如果增加到更多的數,只需改一下代碼中相應的數字即可。
(本文完)
新聞熱點
疑難解答