クエリを介して除外マトリックスを実現する最良の方法
-
06-07-2019 - |
質問
クエリを介してこの除外マトリックスを実現する最良の方法は何ですか。
テーブルには一定数の製品があり、アイデアが製品が顧客に販売される場合(行で表される)、他の製品(列)は以下のルールマトリックスに基づいて販売される場合と販売されない場合があります。目的は、特定の販売済み製品コードで販売できる製品コードを取得することです。
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
列全体で行ごとに準備ができています。
解決
形式をマトリックスから関連テーブルに変更できますか
Table AdditionalProducts: SoldProductCode AdditionalProductCode
つまり、テーブルは次のようになります
SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP
これで、単にクエリを実行して発言することができます
SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'
編集
このアプローチのもう1つの利点は、MRLSPNを購入した場合に特別な割引を与えるとLGPが10%オフになり、MRLSDFを購入すると15 $オフになることです。このモデルを使用すると、関連付けテーブルを拡張して追加の属性を含めることができます。これは、モデルに適用される場合と適用されない場合があります。
他のヒント
これは多対多のリンクテーブルです:
Sold CanBeSold ---- --------- MRLSPN LGP MRLSDF LGP …
、およびクエリ:
SELECT CanBeSold
FROM matrix
WHERE Sold = @Product
32列以下を保証できる場合、ビットフラグフィールドとしてint(32ビット)を使用して実装できます。しかし、多対多の関係はより柔軟になります。
多対多のマッピングテーブルProductCode2ProductCodeMappingを作成します
CREATE TABLE ProductCode2ProductCodeMapping
(
ProductCodeId int,
AllowedProductCodeId int
)
これら両方の列を使用する複合主キーを使用。
次に、すべての製品および関連製品の行を挿入します。
その後、次のようにクエリを実行します。
SELECT AllowedProductCodeId
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId
製品の整数IDがない場合は、それらを追加するか、代わりにchar productCodeを使用できます(前者のほうが望ましい)