2011-01-21 9 views
1

私はショップのWebサイトを開発しています。私は、製品(サイズ、色など)に適用されるさまざまなオプションを表しProductOptionは、データベーステーブルを持っている:SQLで可能なすべてのデータの組み合わせを生成する方法は?

ProductOptionId 
ProductOptionGroupId 
ProductId 
Value 

(私は簡潔にするためにこれを簡略化しました)

ProductOptionGroupIdリンクProductOptionGroupテーブルに追加します。グループはサイズなど、および値は、よく、値です - ブラック、レッド、大、小など

私が制限された、製品オプションのすべての可能な組み合わせを生成する必要がありますグループごとに、データベース内の各製品ごとに表示されます。私は、次の示すデータを生成する必要があるだろう

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

:生成物1(グループ1 =カラー、2 =サイズと3 =長さ)については、次のデータ想像

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を使用してこれをどのように達成できますか?

おかげ

+0

3つの列として結果が必要ですか? –

+0

特に指定しません。私はちょうど与えられた製品のすべての製品オプションの組み合わせを返すいくつかの方法が必要です。オプションごとに1行は問題ありませんが、組み合わせをグループ化する必要があります。 –

+0

クロス・ジョインを使用 – Andrew

答えて

3

さて、あなたはウィッヒグループは、事前に製品をWICHに添付されているかわからない特別な場合には、ちょっとそこの問題です。 sql:cursorとdynamic sqlで避けようとする最大のものが2つ必要です。以下のソリューションを使用する前に、このリンク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
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 
+0

私は必要なものを明確にするために、質問を更新しました。私はどのオプション(それゆえグループ)がどの製品に事前に付けられているか分かりません。 「この商品のすべての商品オプションの組み合わせを教えてください」(つまり、WHERE ProductId = n)と言うことができる必要があります。私の例では、3つのグループがありますが、実際にはさらに多くなります。ごめんなさい。私は自分の要求を記述するのが非常に難しいと感じました。 –

0
SQLServerのすべての組み合わせで結果セットを返すCUBE演算子を使用することができます...しかし、あなたがいることを意味している場合、私は知らないで

...

・ホープ、このことができます

ニコラ

関連する問題