Вы можете оставить присоединение продуктов данного промо к продуктам данного заказа, и если строка (-ы) какого-либо продукта заказа вернется в ноль, это будет означать, что заказ не соответствует требованиям этого промо, учитывая ваше определение того, что требуется для квалификации.для промо.
РЕДАКТИРОВАТЬ:
select promoproducts.productid, orderproducts.productid
from promoproducts
left join orderproducts
on promoproducts.productid = orderproducts.productid
where promoid = 'x' and orderid = 'y'
РЕДАКТИРОВАТЬ2: игнорировать выше (см. Комментарий Quassnoi);Подход, который я предлагаю, должен быть выполнен как ЛЕВОЕ СОЕДИНЕНИЕ к встроенному представлению:
select pp.productid as promoproduct, orderproduct
from promoproducts pp
left join
(
select productid as orderproduct
from orderproducts
where orderid=1
) as op
on pp.productid=op.orderproduct
where promoid =1
РЕДАКТИРОВАТЬ3: вместо сравнения заказа с определенным промо (where promoid = x
) его можно сравнить свсе текущие рекламные акции:
... where promoid in (select promoid from promos where startdate ... expirydate ...)
-- find current promos
Реальное преимущество этого подхода с левым объединением состоит в том, что он показывает вам все рекламные акции, на которые распространяется заказ, а также все рекламные акции.он не соответствует критериям и какие продукты должны быть добавлены в заказ, чтобы получить право на промо .