使用:SQL Server 2008 R2
我的目标是取一个给定的整数(n)并选择2列中n位的整数的每个排列,如下所示。
Given: n=4
Output:
ColA ColB
0 0
0 0
0 0
0 0
1 0
1 0
1 0
1 1
2 0
2 0
2 1
2 0
3 0
3 0
3 1
3 1
...
14 1
14 1
14 1
14 0
15 1
15 1
15 1
15 1
输出不,重复不是,需要订购,这可能会或可能不会使这更容易。但是,我确实需要能够将n设置为任何整数...但是为了运行时间,我们假设它将低于10。
提前致谢。
答案 0 :(得分:1)
您可能想尝试一下:
declare @bits int
set @bits = 4
;with AllTheNumbers as (
select cast (POWER(2, @Bits) as int) - 1 Number
union all
select Number - 1
from AllTheNumbers
where Number > 0
),
Bits as (
select @Bits - 1 Bit
union all
select Bit - 1
from Bits
where Bit > 0
)
select *, case when (Number & cast (POWER(2, Bit) as int)) != 0 then 1 else 0 end
from AllTheNumbers cross join Bits
order by Number, Bit desc
AllTheNumbers产生0到2 ^ n-1的数字,Bits产生从0到@Bits的位数 - 1,主要部分连接它们并计算每个位置的位值。
答案 1 :(得分:0)
让我知道如果这是好的,当你说'位'我假设你的意思是2的幂 - 所以你可以在set语句中指定你想要的2的幂,它将返回所有的排列。
DECLARE @Bit INT
SET @Bit = 4
;WITH NUMS AS (
SELECT TOP(POWER(2,@Bit)+1)ROW_NUMBER() OVER(ORDER BY sc.name) - 1 [N]
FROM syscolumns sc
)
SELECT n1.N, n2.N
FROM NUMS n1
CROSS JOIN NUMS n2
WHERE (n1.N + n2.N) <= POWER(2,@Bit)
ORDER BY n1.N, n2.N