У меня есть таблица продуктов и таблица виджетов.Рефакторинг подзапроса в операторе select для соединения
Продукт построен из ряда виджетов, и у меня есть таблица ссылок, которая показывает, какие виджеты связаны с продуктами.
Виджеты могут быть помечены как expired
, что означает, что они не могут быть добавлены ни к каким новым продуктам.
схемы и примеры данных в следующих sqlFiddle -
Я хочу, чтобы запрос, который показывает все правомочные виджеты для конкретного продукта, учитывая следующие правила:
- Виджет не должен быть показаны если он отмечен как истек.
- В качестве исключения из приведенного выше правила. Если виджет отмечен как истек, но уже связан с продуктом, он должен быть показан.
- Если виджет уже связан с продуктом, он должен быть помечен как
'selected'
У меня есть следующий запрос, который работает, и удовлетворяет все вышеперечисленные правила:
select
data.WidgetName,
data.expired,
case
when data.ID in (select data_id from Widget_link where productId = 1)
then 1
else 0
end as selected
from Widget_data data
left outer join Widget_link link
on data.ID = link.data_id and data.expired = 1
where (data.expired = 0 or (data.expired = 1 and link.productId = 1))
Я хотел бы найти способ рефакторинга подзапроса в пределах выделенной части запроса на какое-то соединение. Я пытаюсь создать представление, которое я могу фильтровать, используя только предложение where
, вместо того, чтобы иметь productId
в двух местах. Это возможно?
Это, кажется, хорошо работает - Спасибо! – John