У меня есть две таблицы: «событие» и «event_exception». В таблице «event» есть (логический) столбец «regular», который указывает, должно ли событие происходить регулярно каждый год или нет. В таблице «event_exception» есть столбец «event_id», столбец «год» и столбец (логический) «происходит».
Данные следует интерпретировать следующим образом:
- Некоторые события происходят регулярно каждый год, но иногда они не происходят в исключительных случаях, что кодируется строкой «event» с «event.regular == True» и строкой «event_exception» с «event_exception.occurs == False» для каждый год, когда это событие в исключительных случаях не проводится.
- Некоторые события происходят нерегулярно, но иногда случаются в исключительных случаях. Это кодируется строкой «event» с «event.regular == False» и строкой «event_exception» с «event_exception.occurs == True» для каждого года, когда событие происходит исключительно.
Как написать запрос, соответствующий всем событиям, которые произойдут в этом году?
Мое предположение было чем-то вроде
session.query(Event, EventException).filter(Event.id==EventException.event_id)
.filter(EventException.year==current_year).
filter(or_(
and_(Event.regular==1, EventException.occurs==0, having(count(EventException)==0)),
and_(Event.regular==0, EventException==1, having(count(EventException)>0)
))
, но я не уверен, что предложение having
можно использовать в and_
.