如何在SQL中生成所有可能的数据组合?

时间:2011-01-21 10:33:21

标签: sql tsql

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

ProductOptionId
ProductOptionGroupId
ProductId
Value

(为简洁起见,我简化了这一点)

ProductOptionGroupId链接到ProductOptionGroup表;其中一个组是大小颜色等,而值是 - 黑色,红色,大,小等< / p>

我需要为数据库中的每个产品生成受组限制的所有可能的产品选项组合。想象一下产品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实现此目的?

由于

3 个答案:

答案 0 :(得分:3)

那么,你在那里遇到了一个问题,特别是如果你不知道哪些团体提前与产品挂钩。在我看来,你需要在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

让我知道它是怎么回事。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在SQLServer中你可以使用CUBE运算符,它返回一个带有所有组合的结果集......但我不知道你是否意味着......

希望这有帮助

尼古拉