2009-06-23 5 views
2

Quelle est la meilleure façon d'obtenir cette matrice d'exclusion par requête.Meilleure façon d'obtenir une matrice d'exclusion via la requête

Il y a un nombre fixe de produits dans un tableau et l'idée est de savoir si un produit est vendu à un client (représenté par rangée), les autres produits (colonnes) peuvent être vendus ou non selon la matrice de règles ci-dessous. L'objectif est d'obtenir des codes de produits autorisés à être vendus pour tout code de produit vendu.

ProductCode|MRLSPN|MRLSPPN|MRLSDF|MRLSPDF|LGS|LGP|HOBN|HODF|HVO|HVOF 
MRLSPN  |No |No  |No |No  |No |Yes|No |No |No |No 
MRLSPPN |No |No  |No |No  |No |No |No |No |No |No 
MRLSDF  |No |No  |No |No  |No |Yes|No |No |No |No 
MRLSPDF |No |No  |No |No  |No |No |No |No |No |No 
LGS  |No |No  |No |No  |No |Yes|No |No |No |No 
LGP  |Yes |No  |Yes |No  |No |No |No |No |No |No 
HOBN  |No |No  |No |No  |Yes|Yes|No |No |No |No 
HODF  |No |No  |No |No  |Yes|Yes|No |No |No |No 
HVO  |Yes |Yes |Yes |Yes |Yes|Yes|Yes |Yes |No |No 
HVOF  |Yes |Yes |Yes |Yes |Yes|Yes|Yes |Yes |No |No 

Prêt par rang à travers les colonnes.

Répondre

2

Puis vous changez le format d'une matrice à une table d'association comme

tableau AdditionalProducts: SoldProductCode AdditionalProductCode

donc votre table ressemblerait

SoldProdCode, Additional ProdCode 
MRLSPN, LGP 
MRLSDF, LGP 

Maintenant, vous pouvez simplement lancer une requête pour dire

SELECT AdditionalProductCode 
FROM AdditionalProducts 
WHERE SoldProductcode='MRLSPN' 

Modifier

Un autre avantage de cette approche est que si vous donnez spécial rabais si vous achetez MRLSPN vous obtenez LGP à 10% de réduction et si vous achetez MRLSDF vous pourriez obtenir 15 $ de réduction. Avec ce modèle, vous pouvez étendre la table d'association pour inclure des attributs supplémentaires. Cela peut ou non s'appliquer à votre modèle.

+0

ajouter une clé primaire composite à cette table, ou au moins une –

+0

clé unique Vous devriez certainement avoir un PK sur la table. Soit une clé composite ou en ajoutant une colonne d'identité avec une clé unique (je préfère la clé composite personnellement dans ce cas où il n'y a pas d'informations supplémentaires à stocker) – JoshBerke

+0

Merci Guys - Voici ce que j'ai: CREATE TABLE dbo.ProductMapping ( \t ProductID int NOT NULL, \t ProductCode varchar (30) NOT NULL ) CREATE TABLE dbo.ProductMatrix ( \t ProductSoldID int NOT NULL, -¬ \t ProductCanBeSoldID int NOT NULL, - unique, \t IsAllowed int NOT NULL - 0/1 ) - Query SELECT ProductCanBeSold = lpa.ProductCode DE dbo.ProductMapping lpc INNER JOIN LSM dbo.ProductMatrix SUR lpc.Productint = lsm.ProductSoldID ET lsm.IsAllowed = 1 INNER JOIN dbo.ProductMapping lpa ON lsm.ProductCanBeSoldID = lpa.ProductID O WH lpc.ProductCode = 'MRLSPN' –

0

Si vous ne pouvez pas garantir plus de 32 colonnes, vous pouvez implémenter en utilisant un int (32 bits) comme champ de bit-indicateur. Mais une relation plusieurs-à-plusieurs sera plus flexible.

Créer many-to-many table de correspondance, ProductCode2ProductCodeMapping

CREATE TABLE ProductCode2ProductCodeMapping 
(
    ProductCodeId int, 
    AllowedProductCodeId int 
) 

Avec une clé primaire composite en utilisant ces deux colonnes.

Ensuite, insérez une ligne pour chaque produit et produit associé.

Ensuite, il suffit d'interroger comme:

SELECT AllowedProductCodeId 
FROM ProductCode2ProductCodeMapping 
WHERE ProductCodeId = @myProductCodeId 

Si vous n'avez pas entier ids pour les produits que vous pouvez les ajouter ou d'utiliser le charbon productCode au lieu (je préfère l'ancien)

0

Il est un many-to-many lien table:

 
Sold CanBeSold 
---- --------- 
MRLSPN LGP 
MRLSDF LGP 
… 

, et une requête:

SELECT CanBeSold 
FROM matrix 
WHERE Sold = @Product 
Questions connexes