22,210
社区成员
发帖
与我相关
我的任务
分享
DECLARE chars_str varchar(20) DEFAULT '0123456789';
/* 通过随机截取数字拼接成8位随机数 */
WHILE i < 8 DO
SET str = concat(str,substring(chars_str , FLOOR(1 + RAND()*10 ),1));
SET i = i +1;
END WHILE;
DECLARE @Str VARCHAR(500) = '',
@iCount INT
IF OBJECT_ID('tempdb..#Tmp1') IS NOT NULL
DROP TABLE #Tmp1
IF OBJECT_ID('tempdb..#Tmp2') IS NOT NULL
DROP TABLE #Tmp2
;WITH CTE(Code) AS
(
SELECT 'A'
UNION ALL SELECT 'B'
UNION ALL SELECT 'C'
--UNION ALL SELECT 'D'
--UNION ALL SELECT 'E'
)
SELECT *,
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RNr
INTO #Tmp1
FROM CTE
SELECT @iCount = @@ROWCOUNT
;WITH CTE AS
(
SELECT CONVERT(VARCHAR(100),Code) AS Code,
CONVERT(BIGINT,POWER(2,RNr-1)) AS Flag,
Rnr,
1 AS LoopNr
FROM #Tmp1
UNION ALL
SELECT CONVERT(VARCHAR(100),a.Code + '+' + b.Code),
a.Flag | POWER(2,b.RNr-1),
b.RNr,
a.LoopNr + 1
FROM CTE a
INNER JOIN #Tmp1 b ON POWER(2,b.RNr-1) & a.Flag = 0 AND a.RNr < b.RNr
WHERE a.LoopNr < @iCount
)
SELECT CTE.Code,CTE.Flag,CTE.LoopNr
INTO #Tmp2
FROM CTE
;WITH CTE AS
(
SELECT Code,
Flag,
LoopNr
FROM #Tmp2
UNION ALL
SELECT CONVERT(VARCHAR(100),a.Code + ',' + b.Code),
a.Flag | b.Flag,
a.LoopNr + b.LoopNr
FROM CTE a
INNER JOIN #Tmp2 b ON a.Flag & b.Flag = 0 AND a.LoopNr + b.LoopNr <= @iCount AND a.Flag < b.Flag
)
SELECT CTE.Code
FROM CTE
WHERE CTE.LoopNr = @iCount
ORDER BY CTE.Code
DECLARE @Counted INT=3,@Num1 INT=0,@i INT=0;
WHILE @i<=@Counted
SELECT @Num1=@Num1+POWER(2,@i-1),@i=@i+1
;WITH CTE
AS
(
SELECT 1 AS ID
UNION ALL
SELECT ID+1 FROM CTE WHERE ID<@Counted
),Array2(IDs,Num1,Counted,LatestID1,LatestID2)
AS
(
SELECT CAST (ID AS VARCHAR(100)),@Num1- POWER(2,ID-1),1,ID,ID FROM CTE
UNION ALL
SELECT
CAST(a.IDs+','+RTRIM(b.ID) AS VARCHAR(100)),a.Num1-POWER(2,ID-1),Counted+1,b.ID,a.LatestID2
FROM Array2 AS a
INNER JOIN CTE AS b ON POWER(2,b.ID-1)&a.Num1>0 AND b.ID>a.LatestID1
UNION ALL
SELECT
CAST(a.IDs+'+'+RTRIM(b.ID) AS VARCHAR(100)),a.Num1-POWER(2,ID-1),Counted+1,a.LatestID1,b.ID
FROM Array2 AS a
INNER JOIN CTE AS b ON POWER(2,b.ID-1)&a.Num1>0 AND b.ID<a.LatestID2
)
SELECT IDs FROM Array2 WHERE Counted=@Counted ORDER BY IDs
/*
IDs
1,2,3
2,3+1
2+1,3
3+2+1
*/
DECLARE @Counted INT=3,@Num1 INT=0,@i INT=0;
WHILE @i<=@Counted
SELECT @Num1=@Num1+POWER(2,@i-1),@i=@i+1
;WITH CTE
AS
(
SELECT 1 AS ID
UNION ALL
SELECT ID+1 FROM CTE WHERE ID<@Counted
),Array2(IDs,Num1,Counted,LatestID)
AS
(
SELECT CAST (ID AS VARCHAR(100)),@Num1- POWER(2,ID-1),1,ID FROM CTE
UNION ALL
SELECT
CAST(a.IDs+','+RTRIM(b.ID) AS VARCHAR(100)),a.Num1-POWER(2,ID-1),Counted+1,b.ID
FROM Array2 AS a
INNER JOIN CTE AS b ON POWER(2,b.ID-1)&a.Num1>0 AND b.ID>a.LatestID
UNION ALL
SELECT
CAST(a.IDs+'+'+RTRIM(b.ID) AS VARCHAR(100)),a.Num1-POWER(2,ID-1),Counted+1,b.ID
FROM Array2 AS a
INNER JOIN CTE AS b ON POWER(2,b.ID-1)&a.Num1>0 AND b.ID<a.LatestID
)
SELECT IDs FROM Array2 WHERE Counted=@Counted ORDER BY IDs
/*
IDs
1,2,3
1,3+2
2,3+1
2+1,3
3+1,2
3+2+1
*/
0 A,B+C C B
0 A+B,C C C
这条点解释不在结果集里,+号在前成立 (A+C,B)
A,C+B
同顺序无关,按你的生成规则这一条也应该在结果里DECLARE @Counted INT=3;
;WITH CTE
AS
(
SELECT 1 AS ID
UNION ALL
SELECT ID+1 FROM CTE WHERE ID<@Counted
),Array1(IDs,CHK,ID1,ID2,Counted)
AS
(
SELECT CAST(ID AS VARCHAR(100)),POWER(2,ID-1),ID,ID,1 FROM CTE
UNION ALL
SELECT CAST(a.IDs+','+RTRIM(b.ID) AS VARCHAR(100)),a.CHK+POWER(2,b.ID-1),b.ID,b.ID,a.Counted+1 FROM Array1 AS a INNER JOIN CTE AS b ON POWER(2,b.ID-1)&a.CHK=0 AND b.ID>a.ID1
UNION ALL
SELECT CAST(a.IDs+'+'+RTRIM(b.ID) AS VARCHAR(100)),a.CHK+POWER(2,b.ID-1),a.ID1,b.ID,a.Counted+1 FROM Array1 AS a INNER JOIN CTE AS b ON POWER(2,b.ID-1)&a.CHK=0 AND b.ID>a.ID2
)
SELECT IDs FROM Array1 WHERE Counted=@Counted ORDER BY IDs
/*
IDs
1,2,3
1,2+3
1+2,3
1+2+3
1+3,2
*/