Sql 炼金术相关子查询

问题描述 投票:0回答:1
class Person(Base):
    __tablename__ = "stanovnik"

    id = Column(Integer, primary_key=True)
    ime = Column(String(20))
    prezime = Column(String(50))
    nadimak=Column(String(50),nullable=True)
    spol = Column(String(5))
    ratni_staz = Column(Integer)
    godine = Column(Integer)
    broj_clanova=Column(Integer,nullable=True)
    sifra_adr = Column(Integer,ForeignKey('adresa.sifra_adrese'))
    sifra_part = Column(Integer,ForeignKey('stanovnik.id'),nullable=True)
    sifra_ost = Column(Integer,ForeignKey('ostali.sifra_ostali'),nullable=True)
    adrese=relationship('Address')

class Address(Base):
    __tablename__ = "adresa"

    sifra_adrese=Column(Integer(),primary_key=True)
    naziv_adrese=Column(String(25))
    sifra_mje=Column(Integer(),ForeignKey('mjesto.sifra_mjesta'))
    mjesto=relationship('Village')

唯一的问题是 SQLAlchemy 中的相关子查询,因为在线帮助代码很难,而且 chatgpt 在这种情况下不起作用。

SQL代码为

SELECT id, ime, prezime, ratni_staz 
FROM stanovnik s, adresa a1 
WHERE s.sifra_adr = a1.sifra_adrese
  AND ratni_staz > (SELECT AVG(ratni_staz) 
                    FROM stanovnik s, a2.sifra_adrese
                    WHERE s.sifra_adr = a2.sifra_adrese 
                      AND a1.sifra_adrese = a2.sifra_adrese)

有助于解决这个相关子查询。

需要在select中解决这两个表的简单关联子查询

sqlalchemy correlated-subquery
1个回答
0
投票

SQLAlchemy 将尝试“自动关联”子查询和父查询之间的匹配表,但这在这里不起作用,因为我们只想关联地址。所以你必须用

correlate
指定它。我想这就是你想要的,但也许我不完全理解你的子查询目标。

with Session(engine) as session, session.begin():
    # Subquery should be a single scalar: .scalar_subquery()
    # Correlate on Address (ie. compute average across all Persons at each address): .correlate(Address)
    subq = select(func.avg(Person.ratni_staz)).where(Person.address_id == Address.id).scalar_subquery().correlate(Address)
    q = select(Person, Address).where(Person.address_id == Address.id, Person.ratni_staz > subq)
    for person, address in session.execute(q):
        print (person, address)

关联标量子查询的文档在这里: 标量和相关子查询

© www.soinside.com 2019 - 2024. All rights reserved.