我有一个包含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}}
如何对存在设置限制以使其不要查找整个表,从而使此查询运行得更快?
谢谢
答案 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)