【发布时间】:2021-10-07 12:56:42
【问题描述】:
我有一个子查询,它在我的主查询中的多个 where 条件中使用。因此,子查询多次执行以获得相同的结果。有没有办法存储和使用子查询结果,使其只执行一次。
示例代码:
from sqlalchemy.sql.schema import ForeignKey
from sqlalchemy import Column, Integer, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.expression import select, union
Base = declarative_base()
class Table1(Base):
__tablename__ = 'table1'
id = Column(Integer, primary_key=True)
uuid = Column(Text, unique=True, nullable=False)
class Table2(Base):
__tablename__ = 'table2'
id = Column(Integer, primary_key=True)
uuid = Column(Text, unique=True, nullable=False)
class Table3(Base):
__tablename__ = 'table3'
id = Column(Integer, primary_key=True)
uuid = Column(Text, unique=True, nullable=False)
class Table4(Base):
__tablename__ = 'table4'
id = Column(Integer, primary_key=True)
type = Column(Text, nullable=False)
class Table5(Base):
__tablename__ = 'table5'
id = Column(Integer, primary_key=True)
res_id = Column(Integer, ForeignKey('table4.id'), nullable=False)
value = Column(Text, nullable=False)
class Table1Map(Base):
__tablename__ = 'table1_map'
id = Column(Integer, ForeignKey('table4.id'), primary_key=True, nullable=False)
map_id = Column(Integer, ForeignKey('table1.id'), primary_key=True, unique=True, nullable=False)
class Table2Map(Base):
__tablename__ = 'table2_map'
id = Column(Integer, ForeignKey('table4.id'), primary_key=True, nullable=False)
map_id = Column(Integer, ForeignKey('table2.id'), primary_key=True, unique=True, nullable=False)
class Table3Map(Base):
__tablename__ = 'table3_map'
id = Column(Integer, ForeignKey('table4.id'), primary_key=True, nullable=False)
map_id = Column(Integer, ForeignKey('table3.id'), primary_key=True, unique=True, nullable=False)
sub_query = select([Table5.__table__.c.id]).where(Table5.__table__.c.value=='somevalue')
subquery_1 = select([Table1.__table__.c.uuid.label("map_id"), Table1Map.__table__.c.id.label("id")]).select_from(Table1.__table__.join(Table1Map.__table__, Table1Map.__table__.c.map_id==Table1.__table__.c.id)).where(Table1Map.__table__.c.id.in_(sub_query))
subquery_2 = select([Table2.__table__.c.uuid.label("map_id"), Table2Map.__table__.c.id.label("id")]).select_from(Table2.__table__.join(Table2Map.__table__, Table2Map.__table__.c.map_id==Table2.__table__.c.id)).where(Table2Map.__table__.c.id.in_(sub_query))
subquery_3 = select([Table3.__table__.c.uuid.label("map_id"), Table3Map.__table__.c.id.label("id")]).select_from(Table3.__table__.join(Table3Map.__table__, Table3Map.__table__.c.map_id==Table3.__table__.c.id)).where(Table3Map.__table__.c.id.in_(sub_query))
main_query = union(subquery_1, subquery_2, subquery_3)
print(main_query)
这会产生以下查询。我需要避免这个子查询被重复执行多次。
SELECT TABLE1.UUID AS MAP_ID,
TABLE1_MAP.ID AS ID
FROM TABLE1
JOIN TABLE1_MAP ON TABLE1_MAP.MAP_ID = TABLE1.ID
WHERE TABLE1_MAP.ID IN
(SELECT TABLE5.ID
FROM TABLE5
WHERE TABLE5.VALUE = 'some_value')
UNION
SELECT TABLE2.UUID AS MAP_ID,
TABLE2_MAP.ID AS ID
FROM TABLE2
JOIN TABLE2_MAP ON TABLE2_MAP.MAP_ID = TABLE2.ID
WHERE TABLE2_MAP.ID IN
(SELECT TABLE5.ID
FROM TABLE5
WHERE TABLE5.VALUE = 'some_value')
UNION
SELECT TABLE3.UUID AS MAP_ID,
TABLE3_MAP.ID AS ID
FROM TABLE3
JOIN TABLE3_MAP ON TABLE3_MAP.MAP_ID = TABLE3.ID
WHERE TABLE3_MAP.ID IN
(SELECT TABLE5.ID
FROM TABLE5
WHERE TABLE5.VALUE = 'some_value')
【问题讨论】:
标签: postgresql sqlalchemy query-optimization python-3.6