【问题标题】:How to generate all possible data combinations in SQL?如何在 SQL 中生成所有可能的数据组合?
【发布时间】:2011-01-22 00:08:04
【问题描述】:

我正在开发一个商店网站。我有一个数据库表 ProductOption,它表示适用于产品的各种选项(尺寸、颜色等):

ProductOptionId
ProductOptionGroupId
ProductId
Value

(为简洁起见,我对此进行了简化)

ProductOptionGroupId 链接到 ProductOptionGroup 表;其中一个组是 SizeColor 等,而 Value 是值 - Black、Red、Large、Small 等。

我需要为数据库中的每个产品生成所有可能的产品选项组合,受组限制。想象一下产品 1 的以下数据(其中组 1=颜色,2=尺寸,3=长度):

ProductOptionId, ProductOptionGroupId, Value
1, 1, Red
2, 1, Black
3, 1, Green
4, 2, Large
5, 2, Small
6, 3, Long
7, 3, Short

我需要生成表示以下内容的数据:

Red, Large, Long
Black, Large, Long
Green, Large, Long
Red, Small, Long
Black, Small, Long
Green, Small, Long
Red, Large, Short
Black, Large, Short
Green, Large, Short
Red, Small, Short
Black, Small, Short
Green, Small, Short

...基本上所有可能的组合,在组内。

可以有任意数量的组,每个产品可以有任意数量的产品选项。我需要能够仅通过提前知道 ProductId 来生成结果(即给我这个产品的所有产品选项组合)。

如何使用 SQL Server 2005 实现这一点?

谢谢

【问题讨论】:

  • 你需要三列的结果吗?
  • 不具体。我只需要某种方式来返回任何给定产品的所有产品选项组合。每个选项一行就可以了,但我需要能够将这些组合组合在一起。

标签: sql tsql


【解决方案1】:

嗯,你在这方面有点问题,特别是如果你不知道哪些组与哪些产品相关联。在我看来,你需要在 sql 中尽量避免两件最重要的事情:游标和动态 sql。在使用以下解决方案之前,您应该查看此链接The Curse and Blessings of Dynamic SQL。然后,你可以试试这个:

DECLARE @ProductId INT, @Query NVARCHAR(MAX), @ProductOptionGroupId INT
SET @ProductId = 1
SET @Query = ''

DECLARE CC CURSOR FOR
SELECT DISTINCT ProductOptionGroupId
FROM YourTable
WHERE ProductId = @ProductId

OPEN CC
FETCH NEXT FROM CC INTO @ProductOptionGroupId
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Query = @Query + '(SELECT DISTINCT Value FROM YourTable WHERE ProductOptionGroupId='+CAST(@ProductOptionGroupId AS VARCHAR)+'AND ProductId='+CAST(@ProductId AS VARCHAR)+
                 +') AS Table' + CAST(@ProductOptionGroupId AS VARCHAR)+' CROSS JOIN '

    FETCH NEXT FROM CC INTO @ProductOptionGroupId
END
CLOSE CC
DEALLOCATE CC
SET @Query = 'SELECT * FROM ' + LEFT(@Query,LEN(@Query)-10)

PRINT @Query
EXEC sp_executesql @Query

告诉我进展如何。

【讨论】:

    【解决方案2】:
    SELECT PO1.Value, PO2.Value, PO3.Value
    FROM ProductOption PO1, ProductOption PO2, ProductOption PO3 
    WHERE PO1.ProductOptionGroupID = 1
    AND PO2.ProductOptionGroupID = 2
    AND PO3.ProductOptionGroupID = 3
    

    【讨论】:

    • 我已经更新了这个问题,以更好地阐明我的需求。我不会提前知道哪些选项(以及因此组)与哪些产品相关联。我需要能够说“给我这个产品的所有产品选项组合”(即 WHERE ProductId = n)。在我的示例中,有三个组,但实际上还会有更多。对不起。我发现很难描述我的要求。
    【解决方案3】:

    在 SQLServer 中,您可以使用 CUBE 运算符,它返回所有组合的结果集...但我不知道您是不是这个意思...

    希望对你有帮助

    尼古拉

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2016-08-16
      • 2016-01-07
      相关资源
      最近更新 更多