2017-09-19 12 views
2

SQLAlchemy内の単一のテーブルを対象とする左外部結合を使用する方法を理解するのは難しいです。SQLAlchemyを使用して1つのテーブルに左外部結合を作成する方法

私は、次のSQLクエリがあります。

------------------------------------------------------------------- 
| participant_id | sport_id | day_id | result | result1 | result2 | 
------------------------------------------------------------------- 
|    1 |  1 |  1 |  7 |  7 |  7 | 
|    2 |  1 |  1 |  13 |  13 |   | 
|    3 |  1 |  1 |  0 |  0 |  1 | 
|    4 |  1 |  1 |  5 |  5 |  5 | 
|    5 |  1 |  1 |  20 |  20 |  21 | 
------------------------------------------------------------------- 

そして、私は現在、次のSQLAlchemyのスクリプトがあります:

results = db.session.query(Participation). \ 
    <maybe something here?> 
    all() 

をしかし、その私に、次の結果セットを提供します

select r1.*, r1.result as result1, r2.result as result2 
from 
    (
     select * from participation 
     where day_id = 1 
     and sport_id = 1 
    ) 
    r1 
left join 
    (
     select * from participation 
     where day_id = 3 
     and sport_id = 1 
    ) 
    r2 
on r1.participant_id = r2.participant_id 

を各結果を独自の行として返します。誰でもその仕事をするために必要なことを指摘できますか?あなたは、単に二回alias a subqueryに必要とouterjoin与えられた情報で

+0

この質問は[MCVE]適切を欠いています。 2つのクエリは大きく異なります。少数のサンプルデータ、モデル、およびそれらの結果として受け取るものを提供してください。 「次のSQL /左外部結合表を表現する方法」の部分は簡単ですが、残りは謎です。 –

+0

ありがとう、私は元の質問をできるだけ小さく編集しました。 – Unkulunkulu

答えて

0

r1 = aliased(
    Participation, 
    db.session.query(Participation). 
     filter_by(day_id=1, sport_id=1). 
     subquery()) 

r2 = aliased(
    Participation, 
    db.session.query(Participation). 
     filter_by(day_id=3, sport_id=1). 
     subquery()) 

results = db.session.query(r1, r2.result, ...).\ 
    ... 
    outerjoin(r2, r1.participant_id == r2.participant_id) 
+0

これに答える時間をとってくれてありがとう。しかし、それはうまくいかないようです。 synalchemy.exc.ProgrammingError:( "psycopg2.ProgrammingError")テーブル "anon_2"のFROM節項目がありません 行4:... = 3 AND participation.sport_id = 1)as anon_1 on anon_2.par。 .. – Unkulunkulu

+0

おっと、申し訳ありません。私はその結果の変更されたクエリ部分を見逃しました。ありがとう私はこれを受け入れられるとマークします! – Unkulunkulu

関連する問題