具有限制

时间:2017-05-06 19:47:41

标签: sql sql-server permutation

我正在尝试生成一个只包含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

1 个答案:

答案 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就是它的一个例子。