2009-06-23 29 views
2

通过查询来实现排除矩阵的最佳方式是什么?通过查询实现排除矩阵的最佳方法

表中有固定数量的产品,想法是如果产品销售给客户(以行表示),其他产品(列)可能或不可能基于下面的规则矩阵出售。目标是获得允许出售任何给定的销售产品代码的产品代码。

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 

按行排列。

回答

2

能你从矩阵更改格式的关联表像

表AdditionalProducts: SoldProductCode AdditionalProductCode

所以,你的表看起来像

SoldProdCode, Additional ProdCode 
MRLSPN, LGP 
MRLSDF, LGP 

现在,你可以简单地运行一个查询说

SELECT AdditionalProductCode 
FROM AdditionalProducts 
WHERE SoldProductcode='MRLSPN' 

编辑

这种方法的另一个好处是,如果你给什么特别的如果您购买MRLSPN,可享受10%折扣的LGP折扣,如果您购买MRLSDF,则可能会获得15美元折扣。借助此模型,您可以扩展关联表以包含其他属性。这可能适用于您的模型,也可能不适用。

+0

添加复合主键到该表,或至少一个唯一的密钥 – 2009-06-23 15:04:10

0

如果可以保证不超过32列,则可以使用int(32位)作为位标志字段来实现。但是多对多的关系会更加灵活。

创建许多一对多映射表,ProductCode2ProductCodeMapping

CREATE TABLE ProductCode2ProductCodeMapping 
(
    ProductCodeId int, 
    AllowedProductCodeId int 
) 

随着同时使用这些列的复合主键。

然后为每个产品和相关产品插入一行。

然后简单地询问:

SELECT AllowedProductCodeId 
FROM ProductCode2ProductCodeMapping 
WHERE ProductCodeId = @myProductCodeId 

如果没有整数标识的产品,你可以将它们添加或使用CHAR PRODUCTCODE而不是(我宁愿是前者)

0

这是一个许多一对多连接表:

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

,并查询:

SELECT CanBeSold 
FROM matrix 
WHERE Sold = @Product 
相关问题