Sql server 如何在SQL SERVER上列出列中所有可能的组合?

Sql server 如何在SQL SERVER上列出列中所有可能的组合?,sql-server,Sql Server,有一个下拉列表列出了特定列的所有可能组合。我试图模仿下拉列表,这样我就可以用相同的键值以正确的顺序获得它。我相信它使用位计数 范例 CategoryID, Name ---- ---- 1 Brody 2 Chad 3 Stacy 4 Jessica 我想让它像这样输出 Brody Chad Brody Chad Stacy Stacy Brody Stacy Chad Stacy Brody Cha

有一个下拉列表列出了特定列的所有可能组合。我试图模仿下拉列表,这样我就可以用相同的键值以正确的顺序获得它。我相信它使用位计数

范例

CategoryID, Name
----        ----
1           Brody
2           Chad
3           Stacy
4           Jessica
我想让它像这样输出

Brody
Chad
Brody Chad
Stacy
Stacy Brody
Stacy Chad
Stacy Brody Chad
Jessica
Jessica Brody
Jessica Chad
Jessica Brody Chad
Jessica Stacy
Jessica Brody Stacy
Jessica Chad Stacy
Jessica Brody Chad Stacy
我试着做一些类似于帕维尔·乌尔班切克的回答


这是一个奇怪的要求,我不知道有什么方法可以让它变得简单。您可以根据表中的行数进行动态调整,但行数会很快变得非常庞大

这里有一种方法可以解决这个问题。这不是很有效,但是这里的需求与关系数据的规范相比已经足够了。如果这是一个持久性列表,我会将其存储在另一个表中,并根据需要重新生成它,而不是反复运行这种事情

这至少会返回您声明想要的结果,尽管名称的顺序不同,因为我并不真正理解这些名称在每行中的顺序逻辑

declare @Something table (CategoryID int, Name varchar(10))
insert @Something values
(1, 'Brody')
, (2, 'Chad')
, (3, 'Stacy')
, (4, 'Jessica')

select Name1 = s.Name
    , Name2 = null
    , Name3 = null
    , Name4 = null
from @Something s

UNION ALL

select s.Name
    , s2.Name
    , null
    , null
from @Something s
cross join @Something s2
where s.Name < s2.Name

UNION ALL

select s.Name
    , s2.Name
    , s3.Name
    , null
from @Something s
cross join @Something s2
cross join @Something s3
where s.Name < s2.Name
    and s.Name < s3.Name
    and s2.Name < s3.Name

UNION ALL

select s.Name
    , s2.Name
    , s3.Name
    , s4.Name
from @Something s
cross join @Something s2
cross join @Something s3
cross join @Something s4
where s.Name < s2.Name
    and s.Name < s3.Name
    and s2.Name < s3.Name
    and s.Name < s4.Name
    and s2.Name < s4.Name
    and s3.Name < s4.Name

为什么这个问题的答案不起作用?我看起来和我使用光标的想法完全一样。如果你不确定有多少种组合,尽量不要在。。。而不是加入=你的尝试有什么问题?你有错误吗?这可能需要什么。这实际上不是关系数据的工作方式。当您开始向表中添加更多行时,您将获得一个惊人的巨大结果集。@SeanLange我正在根据我必须模仿的旧设计重新创建它。但是旧数据库的下拉键是按这种顺序基于每个可能的组合的。我想知道这是否是可以使用递归CTE的东西。您必须跟踪级别的数量,其中级别计数是要开始的行数。讨厌。@TechGnome我不知道你如何在不增加每一个新级别的连接数量的情况下做到这一点。不知道你会如何利用rCTE来实现这一点。我自己也在思考,但似乎没有什么意义。是的,我承认,在抽筋开始之前,我没有花超过5分钟思考它。。。我只是不喜欢所有的工会,所以我觉得应该有更好的办法。我知道我以前在rCTEs上做过一些funkay的事情,所以我一直在大声思考是否可行。不幸的是,我没有访问SQL Server的权限,在那里我可以试用它。@TechGnome它可能通过几个三角形连接来完成,这就是我现在正在复制的东西,我想起来了。不确定它是否会产生更好的执行计划,但至少会减少大量代码。