2011-01-21 5 views
1

Je développe un site web de magasin. J'ai une table de base de données, ProductOption, qui représente les différentes options qui sont applicables à un produit (tailles, couleurs, etc.):Comment générer toutes les combinaisons de données possibles dans SQL?

ProductOptionId 
ProductOptionGroupId 
ProductId 
Value 

(j'ai simplifié ce par souci de concision)

liens ProductOptionGroupId à la table ProductOptionGroup; où un groupe est Taille, couleur etc, et la valeur est, bien, la valeur - Noir, Rouge, Grand, Petit etc.

je besoin de générer toutes les combinaisons possibles d'options de produits, restreint par groupe, pour chaque produit de la base de données. Imaginez les données suivantes pour le produit 1 (où le groupe 1 = couleur, 2 = Taille et 3 = Longueur):

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

je besoin de générer des données représentant les suivantes:

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 

.. .basiquement toutes les combinaisons possibles, au sein des groupes.

Il peut y avoir un nombre quelconque de groupes et un nombre illimité d'options de produits pour chaque produit. Je dois être en mesure de générer les résultats en ne connaissant le produit que par avance (c'est-à-dire en me donnant toutes les combinaisons d'options de produits pour ce produit).

Comment puis-je y parvenir en utilisant SQL Server 2005?

Merci

+0

Avez-vous besoin du résultat en trois colonnes? –

+0

Pas spécifiquement. J'ai juste besoin d'un moyen de retourner toutes les combinaisons d'options de produits pour un produit donné. Une rangée par option est bien, mais il faudrait que je puisse regrouper les combinaisons. –

+0

utiliser une jointure croisée – Andrew

Répondre

3

Eh bien, vous êtes dans un peu d'un problème, surtout si vous ne connaissez pas les groupes Wich sont attachés à wich produits à l'avance. Il me semble que vous aurez besoin de deux des plus grandes choses à éviter dans sql: les curseurs, et le SQL dynamique. Avant d'utiliser la solution suivante, vous devriez jeter un oeil à ce lien The Curse and Blessings of Dynamic SQL. Ensuite, vous pouvez essayer ceci:

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 

Laissez-moi savoir comment ça se passe.

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

J'ai mis à jour la question pour mieux clarifier ce dont j'ai besoin. Je ne saurai pas quelles options (et donc quels groupes) sont attachés à quels produits à l'avance. Je dois être capable de dire "donnez-moi toutes les combinaisons d'options de produits pour ce produit" (c'est-à-dire WHERE ProductId = n). Dans mon exemple, il y a trois groupes, mais en réalité, il y en aura beaucoup d'autres. Pardon. J'ai trouvé cela assez difficile de décrire mes exigences. –

0

SQLServer vous pouvez utiliser CUBE opérateur, qui retourne un ResultSet avec toutes les combinaisons ... mais je ne sais pas si vous dire que ...

Hope this helps

Nicola

Questions connexes