数据库环境: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实现。
/*数据准备*/
WITHx0AS ( SELECT '1' AShidUNION ALL
SELECT '2' AShidUNION ALL
SELECT '3' AShid--UNION ALL
--SELECT '4' AS hid
)/*计算、输出*/
SELECT a.hid + b.hid AShidFROM ( SELECT a.hid + b.hid AShidFROMx0 aFULL JOIN x0 b ON b.hid <>a.hid
) aLEFT JOIN x0 b ON CHARINDEX(b.hid, a.hid, 1) = 0
ORDER BY 1
方法一看起来简单明了,用不着再解释了。现在我们来看一下方法二的实现:
通过CTE实现递归,把1,2,3的所有组合都枚举,最后在外层