SQLAlchemy选择具有Exist限制

时间:2013-01-30 16:53:59

标签: python sql sqlalchemy

我有一个包含4列(1 PK)的表,我需要从中选择30行。 在这些行中,两列(col.A和B)必须存在于另一个表中(8列,1 PK,2是​​A和B)。

第二个表很大,包含数百万条记录,这足以让我知道是否存在包含col值的单行。第1桌的A和B.

我正在使用以下代码:

query = db.Session.query(db.Table_1).\
        filter(
            exists().where(db.Table_2.col_a == db.Table_1.col_a).\
                     where(db.Table_2.col_b == db.Table_2.col_b)
        ).limit(30).all()

这个查询得到了我想要的结果但是我担心它可能有点慢,因为它并不意味着a limit条件对exists()函数也没有select 1但是select * exists() does not accept a .limit(1)

{{1}}

如何对存在设置限制以使其不要查找整个表,从而使此查询运行得更快?

  • 我需要来自 Table_1 的n行,其中 2列存在于记录中 的 TABLE_2

谢谢

2 个答案:

答案 0 :(得分:6)

您可以使用更明确的表单来执行“选择1”操作,因为它提到here,即

exists([1]).where(...)

然而,虽然我一直是一个长期顽固的“选择1”类型的人,但我已经了解到“1”与“*”的表现现在是a myth({{ 3}} / more)。

exists()也是select()的包装器,所以你可以先通过构造select()得到一个limit():

s = select([1]).where(
         table1.c.col_a == table2.c.colb
       ).where(
         table1.c.colb == table2.c.colb
       ).limit(30)
s = exists(s)

答案 1 :(得分:0)

query=select([db.Table_1])
query=query.where(
     and_(
           db.Table_2.col_a == db.Table_1.col_a,
           db.Table_2.col_b == db.Table_2.col_b
          )
     ).limit(30)

result=session.execute(query)