2

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

第二个表很大,包含数百万条记录,这足以让我知道是否存在包含 col 值的单行。第一张桌子的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)

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

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

谢谢

4

2 回答 2

7

您可以使用此处提到的更明确的形式来执行“选择 1” ,即

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

然而,虽然我一直是一个长期顽固的“选择 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)
于 2013-01-31T00:29:43.410 回答
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)
于 2015-12-04T21:43:19.587 回答