通过查询实现排除矩阵的最佳方法

时间:2009-06-23 14:48:52

标签: sql matrix sql-server-2000

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

表中有固定数量的产品,并且想法是产品是否出售给客户(由行表示),其他产品(列)可能会或可能不会根据下面的规则矩阵出售。目的是获得允许销售任何特定销售产品代码的产品代码。

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  

按行排列。

3 个答案:

答案 0 :(得分:2)

您可以将格式从矩阵更改为关联表,例如

表其他产品:    SoldProductCode    AdditionalProductCode

所以你的表看起来像

SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP

现在您只需运行查询即可

SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'

修改

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

答案 1 :(得分:0)

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

创建多对多映射表ProductCode2ProductCodeMapping

CREATE TABLE ProductCode2ProductCodeMapping
(
   ProductCodeId int,
   AllowedProductCodeId int
)

使用这两列的复合主键。

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

然后只需查询:

SELECT AllowedProductCodeId 
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId

如果您没有产品的整数ID,您可以添加它们或使用char productCode代替(我更喜欢前者)

答案 2 :(得分:0)

这是一个多对多链接表:

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

和查询:

SELECT  CanBeSold
FROM    matrix
WHERE   Sold = @Product