2017-09-19 3 views
2

Je n'arrive pas à comprendre comment utiliser la jointure externe gauche ciblant une seule table dans SQLAlchemy.Comment créer une jointure externe gauche à une table à l'aide de SQLAlchemy

J'ai la requête SQL suivante:

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 

Ce qui me donne la resultset suivante:

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

J'ai actuellement le script SQLAlchemy suivant:

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

Mais ce renvoie chaque résultat comme sa propre ligne. Quelqu'un peut-il indiquer ce dont j'ai besoin pour faire ce travail?

+0

Cette question manque un bon [mcve]. Les 2 requêtes sont très différentes. Veuillez fournir un petit ensemble de données d'exemple, vos modèles et ce que vous aimeriez recevoir de leur part. Répondre à la partie "comment représenter le SQL suivant/gauche externe rejoindre une seule table" est simple, mais le reste est un mystère. –

+0

Merci, j'ai édité la question originale pour être aussi minimal que possible. – Unkulunkulu

Répondre

0

Avec les informations que vous avez simplement besoin donné alias a subquery deux fois et outerjoin:

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

Merci d'avoir pris le temps d'y répondre. Cela ne semble pas fonctionner, cependant. Maintenant, je reçois: sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) manquant entrée de la clause FROM pour la table "anon_2" LIGNE 4: ... = 3 ET participation.sport_id = 1) AS anon_1 ON anon_2.par. .. – Unkulunkulu

+0

Oups, désolé ma mauvaise. J'ai raté cette partie de requête modifiée dans les résultats. Merci, je vais marquer cela comme accepté! – Unkulunkulu