Лучший способ получить матрицу исключений с помощью запроса

StackOverflow https://stackoverflow.com/questions/1033045

  •  06-07-2019
  •  | 
  •  

Вопрос

Каков наилучший способ получить эту матрицу исключений с помощью запроса?

В таблице фиксированное количество продуктов, и идея заключается в том, что если продукт продается клиенту (представленному строкой), то другие продукты (столбцы) могут быть проданы, а могут и не быть проданы на основе приведенной ниже матрицы правил.Цель состоит в том, чтобы получить код продукта, который разрешен к продаже для любого данного проданного кода продукта.

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  

Готовьте, распределяя строки по столбцам.

Это было полезно?

Решение

Можете ли вы изменить свой формат с матрицы на ассоциативную таблицу, например

Таблица дополнительных продуктов:Проданный код продукта Дополнительный код продукта

Таким образом, ваш стол будет выглядеть следующим образом

SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP

Теперь вы можете просто запустить запрос, чтобы сказать

SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'

Редактировать

Еще одним преимуществом такого подхода является то, что если вы предоставляете специальные скидки, то при покупке MRLSPN вы получаете LGP со скидкой 10%, а при покупке MRLSDF вы можете получить скидку 15 долларов.С помощью этой модели вы можете расширить ассоциативную таблицу, включив в нее дополнительные атрибуты.Это может относиться, а может и не относиться к вашей модели.

Другие советы

Это таблица ссылок «многие ко многим»:

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

и запрос:

SELECT  CanBeSold
FROM    matrix
WHERE   Sold = @Product

Если вы можете гарантировать не более 32 столбцов, вы можете реализовать использование int (32 бита) в качестве поля битового флага. Но отношения многие ко многим будут более гибкими.

Создайте таблицу сопоставления «многие ко многим», ProductCode2ProductCodeMapping

CREATE TABLE ProductCode2ProductCodeMapping
(
   ProductCodeId int,
   AllowedProductCodeId int
)

С составным первичным ключом, использующим оба этих столбца.

Затем вставьте строку для каждого продукта и связанного продукта.

Затем просто сделайте запрос как:

SELECT AllowedProductCodeId 
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId

Если у вас нет целочисленных идентификаторов для продуктов, вы можете либо добавить их, либо использовать вместо них код продукта charCode (я бы предпочел первый)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top