如何使用SQL在同一列中生成排列?

如何使用SQL在同一列中生成排列?,sql,sql-server,Sql,Sql Server,我有一张如下所示的表: LETTERS -------- A B C D E F G H 我想创建一个视图,列出这些字母的所有3个字母组合,不重复,如下所示,即为每个组合指定一个数字 ViewNew ------- 1 A 1 B 1 C 2 A 2 B 2 D 3 A 3 B 3 E 等等 上述情况是否可能?任何帮助都将不胜感激。如果您想创建两个表之间所有唯一组合的列表,您只需一次从两个表中进行选择,SQL Server将为您提供所需信息。这称为交叉连接 declare @t1 t

我有一张如下所示的表:

LETTERS
--------    
A
B
C
D
E
F
G
H
我想创建一个视图,列出这些字母的所有3个字母组合,不重复,如下所示,即为每个组合指定一个数字

ViewNew
-------
1 A
1 B
1 C
2 A
2 B
2 D
3 A
3 B
3 E
等等


上述情况是否可能?任何帮助都将不胜感激。

如果您想创建两个表之间所有唯一组合的列表,您只需一次从两个表中进行选择,SQL Server将为您提供所需信息。这称为交叉连接

declare @t1 table (letter char(1))
declare @t2 table (number int)

insert @t1 values ('A'), ('B'), ('C')
insert @t2 values (1), (2), (3), (4)

select t2.number, t1.letter from @t1 as t1, @t2 as t2
结果

number  letter
--------------
1       A
1       B
1       C
2       A
2       B
2       C
3       A
3       B
3       C
4       A
4       B
4       C
对于排列(顺序很重要):

将@q声明为表([No]int、L1字符(1)、L2字符(1)、L3字符(1))
插入@q
挑选
行号()超过(按L1.字母、L2.字母、L3.字母、L1.字母排序),
L1.信函,
L2.信函,
L3.信件
从…起
字母L1交叉连接
L2交叉连接的字母
字母为L3
哪里
(L1.字母L2.字母)和
(L2.字母L3.字母)和
(L1.字母L3.字母)
选择[No],L1作为@q的字母
联合
从@q中选择[No],L2
联合
从@q中选择[No],L3
这实际上可以在单个查询中完成,但需要重复@q查询。 如果目标是视图,我会将@q query移动到子视图中

更新:
使用
UNPIVOT
使事情变得更简单,如博萨尔的回答。

检查此项。使用join和UNPIVOT,我们可以找到所有字母的排列

        select ID,ViewNew from 
        (
            select row_number() over(order by (select 1)) AS ID, 
            C2.LETTERS as '1' ,C1.LETTERS AS '2' ,c3.LETTERS as '3' from #tableName C1,#tableName c2,#tableName c3
            where C1.LETTERS != c2.LETTERS  and c2.LETTERS ! = c3.LETTERS and   c1.LETTERS ! = c3.LETTERS
        ) a  
        UNPIVOT
        (
          ViewNew
               FOR [LETTERS] IN ([1], [2], [3])
        )as f
输出:


您想要组合或排列,例如ABC和BAC是否被视为重复?交叉连接不是答案,请查看问题中数字2下的字母。所需的输出使他似乎想要数字作为答案的一部分。既然你指出了这一点,我不知道为什么会有这些。但现在我看到了目标…这很有效。我甚至不知道UNPIVOT的事。我对SQL很陌生。谢谢汉克·德米特里,我最终使用了UNPIVOT,但实际上我在其他方面使用了你的方法的变体。干杯
        select ID,ViewNew from 
        (
            select row_number() over(order by (select 1)) AS ID, 
            C2.LETTERS as '1' ,C1.LETTERS AS '2' ,c3.LETTERS as '3' from #tableName C1,#tableName c2,#tableName c3
            where C1.LETTERS != c2.LETTERS  and c2.LETTERS ! = c3.LETTERS and   c1.LETTERS ! = c3.LETTERS
        ) a  
        UNPIVOT
        (
          ViewNew
               FOR [LETTERS] IN ([1], [2], [3])
        )as f