该表的结果当前无法在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;
这确实导致以下结果:
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”
答案 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
答案 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
填充表格