Melhor maneira de alcançar a matriz de exclusão via consulta
-
06-07-2019 - |
Pergunta
Qual é a melhor maneira de alcançar essa matriz de exclusão via consulta.
Há um número fixo de produtos em uma tabela e a idéia é que, se um produto for vendido a um cliente (representado por linha), os outros produtos (colunas) podem ou não ser vendidos com base na matriz de regra abaixo. O objetivo é obter o código de produtos que podem ser vendidos para qualquer código de produto vendido.
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
Pronto por linha através de colunas.
Solução
Você pode alterar seu formato de uma matriz para uma tabela de associação como
Tabela Adicional PRODUCTS: VENDIDOCODUCTCODEDCODCODCODCODCODCODCO
Então sua mesa ficaria
SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP
Agora você pode simplesmente executar uma consulta para dizer
SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'
Editar
Outro benefício dessa abordagem é que, se você der descontos especiais, se você comprar MRLSPN, receberá LGP com 10% de desconto e, se comprar MRLSDF, poderá receber 15 $. Com este modelo, você pode estender a tabela de associação para incluir atributos adicionais. Isso pode ou não se aplicar ao seu modelo.
Outras dicas
É uma tabela de link para muitos para muitos:
Sold CanBeSold ---- --------- MRLSPN LGP MRLSDF LGP …
, e uma consulta:
SELECT CanBeSold
FROM matrix
WHERE Sold = @Product
Se você puder garantir não mais que 32 colunas, poderá implementar o uso de um INT (32 bits) como um campo de bandeira. Mas um relacionamento de muitos para muitos será mais flexível.
Crie uma tabela de mapeamento de muitos para muitos, ProductCode2ProductCodemapping
CREATE TABLE ProductCode2ProductCodeMapping
(
ProductCodeId int,
AllowedProductCodeId int
)
Com uma chave primária composta usando ambas as colunas.
Em seguida, insira uma linha para cada produto e produto relacionado.
Em seguida, basta consultar como:
SELECT AllowedProductCodeId
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId
Se você não possui IDs inteiros para produtos, você pode adicioná -los ou usar o Char ProductCode (eu preferiria o primeiro)