Хорошо, прежде всего, поскольку prodStock
для набора для путешествий во времени виртуален, вы не можете сохранить его в базе данных, это будет по сути вычисляемое поле. Вероятно, было бы полезно, если бы в таблице было логическое значение, которое говорит, рассчитывается prodStock
или нет. Я сделаю вид, что у вас есть это поле в таблице, и пока я назову его isKit
(где TRUE
означает, что это комплект, а prodStock
должно быть рассчитано).
Теперь для расчета количества каждого товара на складе:
select p.prodID, p.prodName, p.prodCost, p.prodPrice, p.prodStock from prod p where not isKit
union all
select p.prodID, p.prodName, p.prodCost, p.prodPrice, min(c.prodStock) as prodStock
from
prod p
inner join rels r on (p.prodID = r.relDst and r.relType = 4)
inner join prod c on (r.relSrc = c.prodID and not c.isKit)
where p.isKit
group by p.prodID, p.prodName, p.prodCost, p.prodPrice
Я использовал псевдоним c
для второго продукта, чтобы обозначить «компонент». Я явно написал not c.isKit
, поскольку это не будет работать рекурсивно. union all
используется вместо union
по соображениям эффективности, поскольку они оба будут возвращать одинаковые результаты.
Предостережения:
- Это не будет работать рекурсивно (например, если
комплект требует компонентов от
другой комплект).
- Это работает только на наборах
которые требуют только одного из конкретных
предмет (например, если
потребовать 2 конденсатора потока и 1
Мистер Фьюжн, это не сработает).
- Я не проверял это, поэтому могут быть незначительные синтаксические ошибки.
- Это только вычисляет поле
prodStock
; для заполнения других полей вам потребуется аналогичная логика.
Если ваш запрос намного сложнее, чем я предполагал, я прошу прощения, но я надеюсь, что это поможет вам найти решение, которое будет работать.
Что касается обработки данных при покупке комплекта, предполагается, что вы должны хранить prodStock
только в составных частях. Так, например, если вы покупаете машину времени у поставщика, вместо увеличения prodStock
на продукт машины времени, вы бы увеличили его на конденсаторе потока и Mr. fusion.