2016-06-30 5 views
2

との相関クエリにすることができます:たちは、私がフラスコSQLAlchemyの呼び出しに、このSQLクエリを変換しようとしているSQLAlchemyの

SELECT * 
FROM "ENVOI" 
WHERE "ID_ENVOI" IN (SELECT d."ID_ENVOI" 
        FROM "DECLANCHEMENT" d 
        WHERE d."STATUS" = 0 
            AND d."DATE" = (SELECT max("DECLANCHEMENT"."DATE") 
            FROM "DECLANCHEMENT" 
            WHERE "DECLANCHEMENT"."ID_ENVOI" = d."ID_ENVOI")) 

あなたが見ることができるように、それは、サブクエリを使用して、最も重要な部分の一つサブクエリは相関クエリです(外部クエリで定義されたdテーブルを使用します)。

私はsubquery()関数でサブクエリを使用する方法を知っていますが、SQLAlchemyとの相関クエリに関するドキュメントは見つかりません。あなたはそれを行う方法を知っていますか?

+2

「相関サブクエリは、」「同期副問合せ」よりもはるかに多くの一般的な用語です。例は[チュートリアル](http://docs.sqlalchemy.org/ja/latest/core/tutorial.html#correlated-subqueries)にあります。 – univerio

答えて

0

univerioさんのコメントからのリンクに基づいて、私は私の要求のためにこのコードをやった:

Declch = db.aliased(Declanchement) 

maxdate_sub = db.select([db.func.max(Declanchement.date)])\ 
       .where(Declanchement.id_envoi == Declch.id_envoi) 

decs_sub = db.session.query(Declch.id_envoi)\ 
      .filter(Declch.status == SMS_EN_ATTENTE)\ 
      .filter(Declch.date < since)\ 
      .filter(Declch.date == maxdate_sub).subquery() 

envs = Envoi.query.filter(Envoi.id_envoi.in_(decs_sub)).all() 
2

はい、できます。

は、次の例を見て(特にcorrelateメソッド呼び出しを)持っている:あなたが見ることができるようにあなたがcorrelateを呼び出す場合

from sqlalchemy import select, func, table, Column, Integer 

table1 = table('table1', Column('col', Integer)) 
table2 = table('table2', Column('col', Integer)) 


subquery = select(
    [func.if_(table1.c.col == 1, table2.c.col, None)] 
).correlate(table1) 

query = (
    select([table1.c.col, 
      subquery.label('subquery')]) 
    .select_from(table1) 
) 

if __name__ == '__main__': 
    print(query) 

は、次のクエリ

SELECT table1.col, (SELECT if(table1.col = :col_1, table2.col, NULL) AS if_1 
FROM table2) AS subquery 
FROM table1 

になりますselect、与えられたTableはそれに加えられませんFROM - 節。 select_fromを直接指定する場合でも、SQLAlchemyはカラム内のテーブルを簡単に追加するため、これを行う必要があります。

関連する問題