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 Chad
Jessica
Jessica Brody
Jessica Chad
Jessica Brody Chad
Jessica Stacy
Jessica Brody Stacy
Jessica Chad Stacy
Jessica Brody Chad Stacy
我尝试做类似于 Pavel Urbančík 回答的事情。
解决方案
这是一个奇怪的要求,我不知道有什么方法可以让它变得简单。您可以根据表中的行数进行动态处理,但行数很快就会变得不堪重负。
这是您可以解决此问题的一种方法。它不是很有效,但这里的要求足以违反关系数据的规范。如果这是一个持久列表,我会将其存储在另一个表中并根据需要重新生成它,而不是一遍又一遍地运行这种事情。
这至少会返回您所说的结果,尽管名称的顺序不同,因为我并不真正理解这些名称在每一行中的排序逻辑。
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
推荐阅读
- r - 如何折叠键 id 上的行但将唯一测量值保留在新变量中?
- ruby-on-rails - 如果用户可以管理组,CanCanCan 能够创建邀请资源
- amazon-web-services - 有没有办法将 AWS Quicksight 报告发送到 Slack Channel?
- sql - 合并、分区和远程数据库 - 性能调优 Oracle
- javascript - 创建 2 个 dom 路径的公共选择器
- powershell - 复制项递归,但排除所有子文件夹
- visual-studio-code - 如何使用团队:使用 VSCode 登录
- google-sheets - 禁用除所有者以外的所有人的谷歌表格下载
- c# - 尝试捕获异常程序
- sql - 从一个数字排序直到它到达相同的数字 SQL