2012-11-12 9 views
7

カラムaIDの値の接合テーブルを照会して、bIDのID番号リストids=[3,5]のすべての値に一致させたいとします。SqlAlchemy:リスト内の値の代わりにすべて一致するフィルタ?

これは私のジャンクションテーブル(JT)です:

aID bID 
    1  1 
    1  2 
    2  5 
    2  3 
    1  3 
    3  5 

私はこのクエリを持っている:session.query(JT.aID).filter(JT.bID.in_(ids)).all()

このクエリはaID123を返します彼らはすべての3かのいずれかで行を持っているので、 bID列の5。クエリを返すのが2であるのは、そのbID列にidsリストのすべての値を持つ唯一のaID値であるためです。

問題をよりうまく説明する方法がわかりませんが、どうすれば結果に到達できますか?

+1

私は、おそらく一般的な 'sql'タグ用のタグの一つを交換でしょう、これは実際には、一般的なSQLクエリの問題、あなたが改善するだろうという方法ですので、あなたの質問の可視性。 –

答えて

3

行セットに対して機能するクエリを探しています。あなたがテーブルに希望のIDを置くことができる場合は、次のより一般的なアプローチを行うことができます

select aid 
from jt 
where bid in (<your list>) 
group by aid 
having count(distinct bid) = 2 

:私は句を有することにより、グループが最善の方法だと思う

select aid 
from jt join 
    bids 
    on jf.bid = bids.bid 
group by aid 
having count(distinct jt.bid) = (select count(*) from bids) 
+0

SqlAlchemyにはこれに固有の構文がありますか、それともSQLでなければなりませんか? – boadescriptor

+0

SQLAlchemyは、SQL式言語でこれらのようなクエリを生成することができますが、取得する前にPython構文で少し実験する必要があるかもしれません。また、sqlalchemyを使用すると、ダイレクト・クエリをテキスト・リテラルとして発行することもできます。最後に、クエリを動的に構築し、プログラムロジックで何が起きているかに基づいてコンポーネントパーツからアセンブルする必要がある場合は、sqlalchemyのORMツールを使用して実行することができますが、通常は長くて遅く方法が本当に必要でない限り。 – cdaddr

0

てみてください:@Gordon Linoffの答えにとAが に、男ワンの関係にある二つのテーブルABに基づき

session.query(JT.aID).filter(not_(JT.bID.in_(ids))).all() 
9

A.bsと呼ばBに対するyはSQLAlchemyの換算は次のようになります。

from sqlalchemy import func 
session.query(A).join(B).filter(B.id.in_(<your_list>)).group_by(A.id).having(func.count(A.bs) == len(<your_list>)).all() 
関連する問題