outerjoin which returns right table 中的所有连接行,如果至少有一个符合条件
outerjoin which returns all joined rows in right table if at least one matches a condition
我有两个mysqltable,
class Item(Base):
id = Column(BigInteger, primary_key=True)
updated_at = Column(DateTime, nullable=False)
class ItemVariant(Base):
id = Column(BigInteger, primary_key=True)
item_id = Column(BigInteger(), nullable=False, index=True)
updated_at = Column(DateTime, nullable=False)
@declared_attr
def item(self):
return relationship(
'Item',
lazy='select',
uselist=False,
primaryjoin=lambda: foreign(self.item_id) == remote(Item.id),
backref=backref('variants', uselist=True)
)
ItemVariants 不一定需要为每个 Item 存在。我有意明确地不想添加外键约束。
我想 select (item, [list of item_variants with item_variant.item_id == item.id])
,item.updated_at > some_date
或 item_variant.update_at > some_date
中的任何一个。
类似
的查询
session.query(
*my_columns_with_aliases
).select_from(
Item
).filter(
or_(
Item.updated_at > some_date,
ItemVariant.updated_at > some_date
)
).outerjoin(
ItemVariant, ItemVariant.item_id == Item.id
)
不起作用,因为如果我有 item_1
和 var_1, var_2
,并且只有 var_1.updated_at
匹配条件,var_2
将不会包含在查询中结果。
我也试过为过滤做第二个别名外连接(对 select 使用非别名 table),但是这个 returns 结果太多了。
“如果至少有一个符合条件,则获取所有变体”是否有标准解决方案?
我最终将它分成两个查询并使用 union_all
。
我有两个mysqltable,
class Item(Base):
id = Column(BigInteger, primary_key=True)
updated_at = Column(DateTime, nullable=False)
class ItemVariant(Base):
id = Column(BigInteger, primary_key=True)
item_id = Column(BigInteger(), nullable=False, index=True)
updated_at = Column(DateTime, nullable=False)
@declared_attr
def item(self):
return relationship(
'Item',
lazy='select',
uselist=False,
primaryjoin=lambda: foreign(self.item_id) == remote(Item.id),
backref=backref('variants', uselist=True)
)
ItemVariants 不一定需要为每个 Item 存在。我有意明确地不想添加外键约束。
我想 select (item, [list of item_variants with item_variant.item_id == item.id])
,item.updated_at > some_date
或 item_variant.update_at > some_date
中的任何一个。
类似
的查询session.query(
*my_columns_with_aliases
).select_from(
Item
).filter(
or_(
Item.updated_at > some_date,
ItemVariant.updated_at > some_date
)
).outerjoin(
ItemVariant, ItemVariant.item_id == Item.id
)
不起作用,因为如果我有 item_1
和 var_1, var_2
,并且只有 var_1.updated_at
匹配条件,var_2
将不会包含在查询中结果。
我也试过为过滤做第二个别名外连接(对 select 使用非别名 table),但是这个 returns 结果太多了。
“如果至少有一个符合条件,则获取所有变体”是否有标准解决方案?
我最终将它分成两个查询并使用 union_all
。