【发布时间】:2011-11-23 17:47:15
【问题描述】:
我有一个两列视图
Product Id Tag
----------------------
1 Leather
1 Watch
2 Red
2 Necklace
2 Pearl
我正在尝试获取产品的所有可能的标签组合:
1 Leather
1 Leather,Watch
2 Pearl
2 Pearl,Necklace
2 Pearl Necklace,Red
2 Necklace
2 Necklace, Red
2 Red
我发现并窃取了一些 SQL,它们为我提供了所有但不是小版本的完整列表,如下所示。
任何想法,都开始让我头疼。虚拟品脱以获得最佳答案。
SELECT ProductId,
(SELECT CAST(Tag + ', ' AS VARCHAR(MAX))
FROM ProductByTagView
WHERE Product.ProductId = ProductByTagView.ProductId
order by tag
FOR XML PATH ('')) AS Tags
FROM Product
【问题讨论】:
-
在 SQL 中生成所有可能的组合是困难的;你最好用客户端语言来做,比如 PHP、perl 或 C#
-
主要问题是组合的数量呈指数增长。至少一个标签有 (2^n -1) 种组合。 (您的列表中缺少
Red,Pearl,其中 n =3)。 n 能达到多大? -
@Andomar 我想你可能已经找到答案了。如下所述,我有 40 多万个产品和 50 个 ish 标签,理论上每个产品都可以有 50 个标签,但实际上不会超过 10 个。
-
如果每个产品都可以有 50 个标签的任意组合,那么您正在查看每个产品大约 50 个阶乘(表示为 50 个!)组合 - 或者换句话说,超过 10^64。即使将输出限制为所有 50 个标签中的任何 15 个,也应该会给您大约 10^24 个组合。有没有办法进一步缩小组合的数量?
标签: sql sql-server sql-server-2008 tsql permutation