我有一张桌子
class Term(CommonFunctions, Base):
__tablename__ = 'terms'
id = Column(Integer, primary_key=True,autoincrement=True)
term_begin = Column(Date, nullable=False)
term_end = Column(Date)
term_served = Column(Integer) # term_number # calculatable?
office_type_id = Column(Integer, ForeignKey(OfficeType.id))
office_type = relationship('OfficeType', backref='terms')
state_id = Column(Integer, ForeignKey(State.id))
state = relationship('State', backref='terms')
district_id = Column(Integer, ForeignKey(District.id))
district = relationship('District', backref='terms')
office_class = Column(Integer)
# ... other fieldds
我正在尝试运行一个报告,以查找具有相同数据集的行的ID对(state_id,district_id,office_type_id,office_class) 对于特定日期范围内的特定office_type_id。
我现在的查询 - (institution = office_type_id)
date = request.args.get('date')
institution = request.args.get('institution')
term_alias = aliased(schema.Term)
composition = Session.query(schema.Term.id, term_alias.id).\
filter(schema.Term.id != term_alias.id).\
filter(schema.Term.office_class == term_alias.office_class).\
filter(schema.Term.state_id == term_alias.state_id).\
filter(schema.Term.office_type_id == term_alias.office_type_id).\
filter(schema.Term.office_type_id == institution).\
filter(schema.Term.office_class != 0).\
filter(and_(schema.Term.term_begin <= date, or_(schema.Term.term_end >= date,
schema.Term.term_end == None))).\
all()
这在某种意义上是有效的。我得到了有效的结果,但它重现了两次结果,对于每一个版本的一次。
例如:
[(127,196), (196,127)]
我的问题是,如何更新查询,仅包括尚未由逻辑等效对表示的对。
我希望上述设置为[(127, 196)]
或[(196,127)]
,而不是两者。
感谢您阅读
答案 0 :(得分:1)
一种常见的方法是强加一个特定的(任意)排序:
Session.query(...).filter(..., schema.Term.id < term_alias.id)
如果你可以找回一对“反身”对(一对相同的ID),你也需要应用一个不同的。
Session.query(...).filter(..., schema.Term.id < term_alias.id).distinct()