如果四个的话,直接这样;WITH TB(ID,Code)AS(
SELECT 1,'A'
UNION ALL SELECT 2,'B'
UNION ALL SELECT 3,'C'
UNION ALL SELECT 4,'D'
)
SELECT Code
FROM TB
UNION ALL
SELECT T1.Code+T2.Code
FROM TB T1
JOIN TB T2 ON T1.ID<T2.ID
UNION ALL
SELECT T1.Code+T2.Code+T3.Code
FROM TB T1
JOIN TB T2 ON T1.ID<T2.ID
JOIN TB T3 ON T2.ID<T3.ID
UNION ALL
SELECT T1.Code+T2.Code+T3.Code+T4.Code
FROM TB T1
JOIN TB T2 ON T1.ID<T2.ID
JOIN TB T3 ON T2.ID<T3.ID
JOIN TB T4 ON T3.ID<T4.ID不确定的话,就动态处理
SELECT 1,'A'
UNION ALL SELECT 2,'B'
UNION ALL SELECT 3,'C'
UNION ALL SELECT 4,'D'
)
SELECT Code
FROM TB
UNION ALL
SELECT T1.Code+T2.Code
FROM TB T1
JOIN TB T2 ON T1.ID<T2.ID
UNION ALL
SELECT T1.Code+T2.Code+T3.Code
FROM TB T1
JOIN TB T2 ON T1.ID<T2.ID
JOIN TB T3 ON T2.ID<T3.ID
UNION ALL
SELECT T1.Code+T2.Code+T3.Code+T4.Code
FROM TB T1
JOIN TB T2 ON T1.ID<T2.ID
JOIN TB T3 ON T2.ID<T3.ID
JOIN TB T4 ON T3.ID<T4.ID不确定的话,就动态处理
SET @SQL=''
DECLARE @MAX INT,@INDEX INT
SELECT @MAX=COUNT(1)FROM TB
SET @INDEX=1
SET @SQL='SELECT Code FROM TB'
WHILE @INDEX<@MAX
BEGIN
SET @TABLE='TB T1'
SET @COLUMN='T1.Code'
SET @INDEX=@INDEX+1
SELECT @TABLE=@TABLE+' JOIN TB T'+CAST(number AS VARCHAR(10))+' ON T'+CAST(number-1 AS VARCHAR(10))+'.ID<T'+CAST(number AS VARCHAR(10))+'.ID'
,@COLUMN=@COLUMN+'+T'+CAST(number AS VARCHAR(10))+'.Code'
FROM master..spt_values
WHERE type='P'AND number>1 AND number<=@INDEX
SET @SQL=@SQL+' UNION ALL SELECT '+@COLUMN+' FROM '+@TABLE
END
--PRINT @SQL
EXEC(@SQL)
SELECT 1,'A'
UNION ALL SELECT 2,'B'
UNION ALL SELECT 3,'C'
UNION ALL SELECT 4,'D'
)
,r(str,lastID) AS (
SELECT Convert(varchar(max), Code),
ID
FROM tb
UNION ALL
SELECT Convert(varchar(max), r.str+tb.code),
tb.ID
FROM r
JOIN tb
ON tb.ID > r.lastID
)
SELECT * FROM r ORDER BY LEN(str),str
str
----
A
B
C
D
AB
AC
AD
BC
BD
CD
ABC
ABD
ACD
BCD
ABCD(15 行受影响)