Il modo migliore per ottenere la matrice di esclusione tramite query
-
06-07-2019 - |
Domanda
Qual è il modo migliore per ottenere questa matrice di esclusione tramite query.
Esiste un numero fisso di prodotti in una tabella e l'idea è se un prodotto è venduto a un cliente (rappresentato da una riga), gli altri prodotti (colonne) possono o meno essere venduti in base alla matrice delle regole di seguito. L'obiettivo è ottenere il codice di prodotti che possono essere venduti per un determinato codice di prodotto venduto.
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 per riga tra le colonne.
Soluzione
Puoi cambiare il tuo formato da una matrice a una tabella di associazione come
Tabella prodotti aggiuntivi: SoldProductCode AdditionalProductCode
Quindi il tuo tavolo sarebbe simile
SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP
Ora puoi semplicemente eseguire una query per dire
SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'
Modifica
Un altro vantaggio di questo approccio è che se offri sconti speciali se acquisti MRLSPN ricevi LGP con uno sconto del 10% e se acquisti MRLSDF potresti ottenere uno sconto di 15 $. Con questo modello è possibile estendere la tabella delle associazioni per includere ulteriori attributi. Questo può o meno essere applicato al tuo modello.
Altri suggerimenti
È una tabella di collegamenti molti-a-molti:
Sold CanBeSold ---- --------- MRLSPN LGP MRLSDF LGP …
e una query:
SELECT CanBeSold
FROM matrix
WHERE Sold = @Product
Se non puoi garantire più di 32 colonne, puoi implementare usando un int (32 bit) come campo bit-flag. Ma una relazione molti-a-molti sarà più flessibile.
Crea una tabella di mapping molti-a-molti, ProductCode2ProductCodeMapping
CREATE TABLE ProductCode2ProductCodeMapping
(
ProductCodeId int,
AllowedProductCodeId int
)
Con una chiave primaria composita che utilizza entrambe queste colonne.
Quindi inserire una riga per ogni prodotto e prodotto correlato.
Quindi esegui una query come:
SELECT AllowedProductCodeId
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId
Se non si dispone di ID interi per prodotti, è possibile aggiungerli o utilizzare il codice prodotto char (preferirei il primo)