我正在尝试生成一个只包含3个值('A','B','C')和范围(1,n)的表格,并有特定的限制。从python的角度考虑它,如果n=5
将是(1A,2A,3A,4B,5C),(1A,2A,3,B,4C,5C),......
限制:
值('A','B','C')必须在每组中至少表示一次,并且必须以'A'开头并以'C'结束(因此1必须='A'和5 must ='C')但中间可以改变,只按字母顺序进行。 。因此,如果:n=5
,那么输出将是一个表格,如:
Col1 Col2 Col3
1 1 A
1 2 A
1 3 A
1 4 B
1 5 C
2 1 A
2 2 A
2 3 B
2 4 C
2 5 C
3 1 A
3 2 B
3 3 B
3 4 B
3 5 C
4 1 A
4 2 B
4 3 B
4 4 C
4 5 C
5 1 A
5 2 B
5 3 C
5 4 C
5 5 C
当Col1引用该集合时,Col2是1到n的数值,Col3是变量A,B或C
答案 0 :(得分:1)
这不是SQL的最佳问题。但你可以用递归CTE来做到这一点:
with vals as (
select v.*
from (values ('A'), ('B'), ('C')) v(x)
),
cte as (
select cast('A' as varchar(max)) as str, 1 as len
union all
select (cte.str + vals.x), cte.len + 1
from cte cross join
vals
where cte.len < 5 - 1
)
select str + 'C'
from cte
where len = 5 - 1;
编辑:
我怀疑你使用&#34;有序排列&#34;意味着您希望As后跟Bs后跟Cs,但绝不会有任何其他顺序。我不认为&#34;订购排列&#34;是正确的术语,但对上述查询的简单修改就是这样做的:
with vals as (
select v.*
from (values ('A'), ('B'), ('C')) v(x)
),
cte as (
select cast('A' as varchar(max)) as str, 1 as len
union all
select (cte.str + vals.x), cte.len + 1
from cte join
vals
on vals.x >= right(cte.str, 1)
where cte.len < 5 - 1
)
select str + 'C'
from cte
where len = 5 - 1;
Here就是它的一个例子。