2016-11-29 10 views
0

私が望むものを達成したmysqlのクエリを書いた。sqlalchemyのネストされたクエリがテーブルを再度選択しないようにするにはどうすればよいですか?

select * from table_a where exists(
    select * from table_b where table_a.x = table_b.x and exists(
    select * from table_c where table_a.y = table_c.y and table_b.z = table_c.z 
) 
) 

私はSQLAlchemyのためのクエリを翻訳した結果は次のように構成されています:少し、このような構造だ

select * from table_a where exists(
    select * from table_b where table_a.x = table_b.x and exists(
    select * from table_c, table_a where table_a.y = table_c.y and table_b.z = table_c.z 
) 
) 

注:このようなクエリを生成

session.query(table_a).filter(
    session.query(table_b).filter(table_a.x == table_b.x).filter(
    session.query(table_c).filter(table_a.y == table_c.y).filter(table_b.x == table_c.z).exists() 
).exists() 
) 

最も内側のクエリでtable_aの再選択 - 意図された機能を壊します。

入れ子になったクエリでsqlalchemyが再びテーブルを選択するのを止める方法はありますか?

答えて

1

correlate all except table_cに最も内側のクエリを教える:のみ囲むSelectからの元素から考えて、「自己相関」とは対照的に

session.query(table_a).filter(
    session.query(table_b).filter(table_a.x == table_b.x).filter(
    session.query(table_c).filter(table_a.y == table_c.y).filter(table_b.x == table_c.z) 
    .exists().correlate_except(table_c) 
).exists() 
) 

を、explicit correlationは候補として任意のネストレベルからの元素から検討します。

関連する問題