7

私のクエリは次のようになります(もちろん、「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

これは、ステータス エントリが存在する場合、商品/注文の組み合わせの生産におけるすべての段階 (作業) と、各段階の現在のステータス (進行状況) を取得するためのものです。そうでない場合でも、ステージを返す必要がありますが、ステータス行は null になります。

これをSQLAlchemyで再生するのに没頭する問題があります。これは 2 つの部分からなる質問でしたが、プレーン SQL でこれを行う方法は既に見つかりました。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()

誰かがより良い解決策や洞察を得た場合に備えて、これを開いたままにしています。

4

1 に答える 1

13

いくつかの命名規則を想定すると、以下のようにする必要があります。

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)
        )

結合の詳細については、結合、外部結合を参照してください。2 番目のパラメーターはonclauseです。複数必要な場合は、and_orを使用or_して必要な式を作成します。

于 2013-03-06T12:33:17.963 に答える