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

Posted

技术标签:

【中文标题】如何在 SQL SERVER 的列中列出所有可能的组合?【英文标题】:How to list every possible combination within a column on SQL SERVER? 【发布时间】:2019-08-20 16:33:31 【问题描述】:

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

例子

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

我尝试做类似于 Pavel Urbančík 回答的事情。

SQL - Find all possible combination

【问题讨论】:

为什么该问题的答案不起作用?我长得一模一样 我的想法是使用光标。如果您不确定可以有多少组合,请尝试“不在 (...)”中,而不是加入!= 您的尝试有什么问题?你收到错误了吗? 这可能需要什么。这真的不是关系数据的工作方式。当您开始向表中添加更多行时,您将获得一个惊人的结果集。 @SeanLange 我正在根据我必须模仿的旧设计重新创建它。但旧数据库按此顺序将下拉键基于每个可能的组合。 【参考方案1】:

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

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

这至少会返回您所说的结果,尽管名称的顺序不同,因为我并不真正理解这些名称在每一行中的排序逻辑。

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

【讨论】:

我想知道这是否可以使用递归 CTE。您必须跟踪级别数,其中级别数是开始的行数。 (恶心)。 @TechGnome 我不明白如果不增加每个新级别的连接数,你怎么能做到这一点。不知道你将如何利用 rCTE。我自己思考了一下,但那里似乎没有任何意义。 是的,我承认,在抽筋开始出现之前,我并没有花超过 5 分钟的时间去想它……我只是不喜欢所有的工会,所以我认为有必须是更好的方法。我知道我以前用 rCTE 做过一些有趣的事情,所以我大声思考它是否可行。不幸的是,我无法访问我可以尝试的 SQL Server。 @TechGnome 它可能可以通过一些三角形连接来完成,这就是我现在正在复制的内容。不确定它会导致更好的执行计划,但至少会少很多代码。

以上是关于如何在 SQL SERVER 的列中列出所有可能的组合?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 的列中删除尾随空格和更新

如何从 SQL Server 中不同行的列中取值?

如何更新账单编号栏?或在 sql server 的列中按顺序排列

如何重命名SQL Server中计算列中引用的列?

如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server

如何在 QT C++ 中从表的列中获取 SQL 中的所有值