Bester Weg, um die Ausschlussmatrix per Abfrage zu erreichen
-
06-07-2019 - |
Frage
Was ist der beste Weg, um diese Ausschlussmatrix durch Abfrage zu erreichen?
Es gibt eine feste Anzahl von Produkten in einer Tabelle und die Idee ist, wenn ein Produkt an einen Kunden verkauft wird (in der Zeile vertreten), können die anderen Produkte (Spalten) basierend auf der unten stehenden Regelmatrix verkauft werden oder nicht. Ziel ist es, Produktcodes zu erhalten, die für einen bestimmten verkauften Produktcode verkauft werden dürfen.
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 nach Spalten.
Lösung
Können Sie Ihr Format von einer Matrix in eine Assoziationstabelle ändern?
Tabelle Zusätzliche Produkte: SoldproductCode zusätzlichproduktCode
Ihr Tisch würde also so aussehen
SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP
Jetzt können Sie einfach eine Anfrage ausführen, um sie zu sagen
SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'
Bearbeiten
Ein weiterer Vorteil dieses Ansatzes ist das, wenn Sie Sonderrabatte angeben, wenn Sie MRLSPN kaufen, haben Sie LGP mit 10% Rabatt und wenn Sie MRLSDF kaufen, erhalten Sie möglicherweise 15 $ Rabatt. Mit diesem Modell können Sie die Assoziationstabelle um zusätzliche Attribute erweitern. Dies kann für Ihr Modell gelten oder nicht.
Andere Tipps
Es ist eine viele zu viele Linkstabellen:
Sold CanBeSold ---- --------- MRLSPN LGP MRLSDF LGP …
, und eine Frage:
SELECT CanBeSold
FROM matrix
WHERE Sold = @Product
Wenn Sie nicht mehr als 32 Spalten garantieren können, können Sie mit einem Int (32 Bit) als Bit-Flag-Feld implementieren. Aber eine viel zu viele Beziehung wird flexibler sein.
Erstellen Sie eine viele zu viele Mapping-Tabellen, ProductCode2ProductCodemapping,
CREATE TABLE ProductCode2ProductCodeMapping
(
ProductCodeId int,
AllowedProductCodeId int
)
Mit einem zusammengesetzten Primärschlüssel mit beiden Spalten.
Fügen Sie dann eine Zeile für jedes Produkt und das verwandte Produkt ein.
Dann einfach als:
SELECT AllowedProductCodeId
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId
Wenn Sie keine Ganzzahl -IDs für Produkte haben, können Sie sie entweder hinzufügen oder den Char ProductCode verwenden (ich würde das erstere bevorzugen)