表格,包含从AA到ZZ的所有可能组合

时间:2019-10-19 11:18:11

标签: sql

  

该表的结果当前无法在SQL中管理,因此我使用了替代方法。感谢任何对此进行调查的人。


我正在寻找在SQL(Microsoft)中创建一个表,其中包含从AA到ZZ的所有可能组合,包括“ NULL”,以便“ AA”是可能的组合之一,然后“ AA”和“ ZZ”是另一个组合。我从以下内容开始,但由于过于复杂而退出了“ AZ”:

    with T_VALUE as (
    select 'AA' as Value union
    select 'AB' union
    select 'AC' union
    select 'AD'     )

select  distinct
    Value as Value_1,
    null as Value_2,
    null as Value_3,
    null as Value_4
from    T_VALUE
union
select  A.Value,
    B.Value,
    null,
    null
from    T_VALUE A
    cross join T_VALUE B
where   A.Value < B.Value
union
select  A.Value,
    B.Value,
    C.Value,
    null
from    T_VALUE A
    cross join T_VALUE B
    cross join T_VALUE C
where   A.Value < B.Value
and B.Value < C.Value
union
select  A.Value,
    B.Value,
    C.Value,
    D.Value
from    T_VALUE A
    cross join T_VALUE B
    cross join T_VALUE C
    cross join T_VALUE D
where   A.Value < B.Value
and B.Value < C.Value
and C.Value < D.Value;

这确实导致以下结果:

screenshot

V1  V2    V3    V4
AA  NULL  NULL  NULL
AA  AB    NULL  NULL
AA  AB    AC    NULL
AA  AB    AC    AD
AA  AB    AD    NULL
AA  AC    NULL  NULL
AA  AC    AD    NULL
AA  AD    NULL  NULL
AB  NULL  NULL  NULL
AB  AC    NULL  NULL
AB  AC    AD    NULL
AB  AD    NULL  NULL
AC  NULL  NULL  NULL
AC  AD    NULL  NULL
AD  NULL  NULL  NULL

我也可以只将值存储在一个字段中。而且我也只需要构建一次表。我可以使用它来引用具有可能组合的项目。我知道会有很多可能性。

关于如何生成查询以更简单的方式编写此表的任何想法?

  

更新:   我确实需要AA-ZZ的所有可能组合,包括“ NULL”值,因为一个选项也可能仅是“ AA”或“ BC”

3 个答案:

答案 0 :(得分:1)

with    list as
        (
        select  ascii('A') as i
        union all
        select  i + 1
        from    list
        where   i < ascii('Z')
        )
select  char(c1.i) + char(c2.i)
from    list c1
cross join
        list c2
union all
select  null

Example at dbfiddle.co.uk

答案 1 :(得分:1)

如果我的理解正确,那么您想要一个表,其中包含2个字符的所有可能组合以及加NULL的顺序,因此没有重复项。

对的总数为27 * 27 = 729(因为已包括NULL)。对于其中四个,有729 * 728 * 727 * 726个可能性。总计:280,110,855,024。尽管可以在数据库中计算和存储那么多数据,但我看不到该实用程序。

话虽如此,这段代码应该可以实现您想要的:

with letters as (
      select  ascii('A') as l
      union all
      select  l + 1
      from letters
      where l < ascii('Z')
     ),
     l2 as (
      select char(c1.l) + char(c2.l) as pair, row_number() over (order by c1.l * 26 + c2.l) as n
      from letters c1 cross join
           letters c2
      union all
      select null, 0 as n
     )
select l2_1.pair, l2_2.pair, l2_3.pair l2_4.pair
from l2 l2_1 join
     l2 l2_2
     on l2_1.n < l2_2.n join
     l2 l2_3
     on l2_2.n < l2_3.n join
     l2 l2_4
     on l2_4.n < l2_3.n;

我不建议任何人实际运行此命令,除非他们希望看到查询破坏他们的系统。

答案 2 :(得分:0)

您可以使用一些联合和交叉联接

      select value as value1, null as value2, null as value3, null value4
      from table1
      union
      select  a.value, b.value, null, null 
      from table1 a
      cross join table1 b
      union
      select  a.value, b.value, c.value, null 
      from table1 a
      cross join table1 b
      cross join table1 c
      union
      select  a.value, b.value, c.value, d.value
      from table1 a
      cross join table1 b
      cross join table1 c
      cross join table1 d      

对于table1开头,您可以使用

  insert into table1
  select concat(t1.1value, t2.value)
  from (
    select  'A' value
    union 
    select 'B'
    union 
    select 'C'
    .....
    select 'Z'
  ) t1
  cross join (
    select  'A' value
    union 
    select 'B'
    union 
    select 'C'
    .....
    select 'Z'

    ) t2

或简单地用A .... Z

填充表格