2009-06-23 5 views
2

Was ist der beste Weg, um diese Ausschlussmatrix über Abfrage zu erreichen.Der beste Weg, Ausschlussmatrix über Abfrage zu erreichen

Es gibt feste Anzahl von Produkten in einer Tabelle und Idee ist, wenn ein Produkt an einen Kunden verkauft wird (dargestellt durch Zeile), die anderen Produkte (Spalten) können oder nicht basierend auf der Regelmatrix unten verkauft werden. Ziel ist es, Produktcode zu erhalten, der für einen bestimmten verkauften Produktcode verkauft werden darf.

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 

Bereit durch Reihe über Spalten.

Antwort

2

Kann ändern Sie Ihr Format aus einer Matrix zu einer Zuordnungstabelle wie

Tabelle AdditionalProducts: SoldProductCode AdditionalProductCode

So Tisch einfach Sie

SoldProdCode, Additional ProdCode 
MRLSPN, LGP 
MRLSDF, LGP 

nun aussehen würde eine Abfrage

SELECT AdditionalProductCode 
FROM AdditionalProducts 
WHERE SoldProductcode='MRLSPN' 

bearbeiten

Ein weiterer Vorteil dieses Ansatzes sagen laufen kann, ist, dass das, was, wenn Sie spezielle geben Rabatte, wenn Sie MRLSPN kaufen, erhalten Sie LGP um 10% und wenn Sie MRLSDF kaufen, erhalten Sie vielleicht 15 $ Rabatt. Mit diesem Modell können Sie die Zuordnungstabelle um zusätzliche Attribute erweitern. Dies kann für Ihr Modell gelten oder auch nicht.

+0

einen zusammengesetzten Primärschlüssel dieser Tabelle hinzuzufügen, oder zumindest ein eindeutiger Schlüssel –

+0

Sie sollen Definitiv eine PK auf dem Tisch haben. Entweder ein zusammengesetzter Schlüssel oder eine Identitätsspalte mit einem eindeutigen Schlüssel hinzufügen (ich bevorzuge den zusammengesetzten Schlüssel persönlich in diesem Fall, wo keine zusätzlichen Informationen gespeichert werden) – JoshBerke

+0

Danke Jungs - Das ist, was ich habe: CREATE TABLE dbo.ProductMapping ( \t ProductID int NOT NULL, \t Product varchar (30) NOT NULL ) CREATE TABLE dbo.ProductMatrix ( \t ProductSoldID NOT NULL int, -¬ \t ProductCanBeSoldID int NOT NULL, - einzigartige \t isAllowed int NOT NULL - 0/1 ) - Abfrage SELECT ProductCanBeSold = lpa.ProductCode VON dbo.ProductMapping lpc INNER JOIN dbo.ProductMatrix LSM ON lpc.Productint = lsm.ProductSoldID UND lsm.IsAllowed = 1 INNER JOIN dbo.ProductMapping lpa ON lsm.ProductCanBeSoldID = lpa.ProduktID WHERE lpc.ProductCode = 'MRLSPN' –

0

Wenn Sie nicht mehr als 32 Spalten garantieren können, können Sie ein int (32 Bit) als Bit-Flag-Feld implementieren. Aber eine Viele-zu-Viele-Beziehung wird flexibler sein.

erstellen many-to-many-Zuordnungstabelle, ProductCode2ProductCodeMapping

CREATE TABLE ProductCode2ProductCodeMapping 
(
    ProductCodeId int, 
    AllowedProductCodeId int 
) 

Mit einem zusammengesetzten Primärschlüssel sowohl die Spalten verwenden.

Anschließend eine Zeile für jedes Produkt und das zugehörige Produkt einfügen.

einfach Dann fragen wie:

SELECT AllowedProductCodeId 
FROM ProductCode2ProductCodeMapping 
WHERE ProductCodeId = @myProductCodeId 

Wenn Sie nicht integer IDs für Produkte haben Sie entweder sie addieren oder die char product stattdessen verwenden (ich würde die ehemalige bevorzugen)

0

Es ist ein many-to-many-Verknüpfungstabelle:

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

und eine Abfrage:

SELECT CanBeSold 
FROM matrix 
WHERE Sold = @Product