我的查询看起来如此(当然,'3'和'4'在实际使用中会有所不同):
SELECT op_entries.*, op_entries_status.*
FROM op_entries
LEFT OUTER JOIN op_entries_status ON op_entries.id = op_entries_status.op_id AND op_entries_status.order_id = 3
WHERE op_entries.op_artikel_id = 4 AND op_entries.active
ORDER BY op_entries.id
如果存在状态条目,这是为了获得文章/订单组合的生产中的所有阶段(操作)以及每个阶段的当前状态(进度)。如果不是,仍然必须返回阶段,但状态行为空。
我在使用SQLAlchemy时遇到了问题。这可能是一个2部分问题,但我找到了做this in plain SQL here already的方法。现在在ORM中,这是一个不同的故事,我甚至无法弄清楚如何使用文档制作JOIN ON条件!
编辑(不允许新用户回答他们自己的问题):
相信我解决了它,我想把它写成一个问题有帮助!也许这会帮助其他一些新手。
query = db.session.query(OpEntries, OpEntriesStatus).\
outerjoin(OpEntriesStatus, db.and_(
OpEntries.id == OpEntriesStatus.op_id,
OpEntriesStatus.order_id == arg_order_id)).\
filter(db.and_(
OpEntries.op_artikel_id == artidQuery,
OpEntries.active)).\
order_by(OpEntries.id).\
all()
如果有人得到更好的解决方案或任何见解,我会保持这种状态。
答案 0 :(得分:6)
假设有一些命名约定,下面应该这样做:
qry = (session.query(OpEntry, OpEntryStatus)
.join(OpEntryStatus, and_(OpEntry.id == OpEntryStatus.op_id, OpEntryStatus.order_id == 3))
.filter(OpEntry.op_artikel_id == 4)
.filter(OpEntry.active == 1)
.order_by(OpEntry.id)
)
有关联接的更多信息,请阅读join, outerjoin,其中第二个参数是onclause
。如果您需要的数量超过1,请使用and_
或or_
创建您需要的任何表达式。