首页 > 解决方案 > 如何在 SQL SERVER 的列中列出所有可能的组合?

问题描述

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

例子

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 - 查找所有可能的组合

标签: sql-server

解决方案


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

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

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

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

推荐阅读