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

Sql 通过查询实现排除矩阵的最佳方法,sql,matrix,sql-server-2000,Sql,Matrix,Sql Server 2000,通过查询实现此排除矩阵的最佳方法是什么 一个表中有固定数量的产品,如果一个产品出售给一个由row表示的客户,则其他产品列可以根据下面的规则矩阵出售,也可以不出售。目的是获取允许针对任何给定的已销售产品代码销售的产品代码 ProductCode|MRLSPN|MRLSPPN|MRLSDF|MRLSPDF|LGS|LGP|HOBN|HODF|HVO|HVOF MRLSPN |No |No |No |No |No |Yes|No |No |No |No MR

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

一个表中有固定数量的产品,如果一个产品出售给一个由row表示的客户,则其他产品列可以根据下面的规则矩阵出售,也可以不出售。目的是获取允许针对任何给定的已销售产品代码销售的产品代码

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  

跨列按行准备。

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

创建多对多映射表ProductCode2ProductCodeMapping

CREATE TABLE ProductCode2ProductCodeMapping
(
   ProductCodeId int,
   AllowedProductCodeId int
)
使用使用这两列的复合主键

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

然后简单地查询如下:

SELECT AllowedProductCodeId 
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId

如果您没有产品的整数Id,您可以添加它们或使用char productCode替代。我更喜欢前者。您能将格式从矩阵更改为关联表吗

表2其他产品: SoldProduct代码 附加产品代码

所以你的桌子看起来像

SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP
现在,您只需运行一个查询

SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'
编辑


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

这是一个多对多链接表:

Sold CanBeSold ---- --------- MRLSPN LGP MRLSDF LGP …
向该表中添加一个复合主键,或者至少添加一个唯一键。您应该在该表中明确拥有一个PK。无论是复合键还是添加具有唯一键的标识列,我个人更喜欢复合键,在这种情况下,没有其他信息要存储Hanks Guys-这就是我得到的:CREATE TABLE dbo.ProductMapping ProductID int NOT NULL,ProductCode varchar30 NOT NULL创建表dbo.ProductMatrix ProductSoldID int NOT NULL,--ProductCanBeSoldID int NOT NULL,-unique IsAllowed int NOT NULL-0/1-Query SELECT ProductCanBeSold=lpa.ProductCode FROM dbo.ProductMapping lpc internal JOIN dbo.ProductMatrix lsm ON lpc.Productint=lsm.ProductSoldID和lsm.IsAllowed=1 internal JOIN dbo.productcanbesolid=lpa.ProductID其中lpc.ProductCode='MRLSPN'
SELECT  CanBeSold
FROM    matrix
WHERE   Sold = @Product