SQLAlchemy选择具有Exist限制

Phi*_*hil 2 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()
Run Code Online (Sandbox Code Playgroud)

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

exists() does not accept a .limit(1)
Run Code Online (Sandbox Code Playgroud)

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

  • 我需要从n行TABLE_1,其中2列在记录中存在TABLE_2

谢谢

zzz*_*eek 6

你可以使用这里提到的更明确的形式来做"选择1"的事情,也就是说,

exists([1]).where(...)
Run Code Online (Sandbox Code Playgroud)

然而,虽然我一直是一个长期顽固的"选择1"类型的人,但我已经了解到"1"与"*"的表现现在是一个神话(更多/更多).

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)
Run Code Online (Sandbox Code Playgroud)