sql >> Database >  >> RDS >> Mysql

Hoe SQL scalaire subquery naar SQLAlchemy-expressie te converteren

Gebruik as_scalar() , of label() :

subquery = (
    session.query(PropertyValuation.valuation)
    .filter(PropertyValuation.zip_code == Property.address_zip)
    .order_by(func.abs(func.datediff(PropertyValuation.as_of, Sale.date_sold)))
    .limit(1)
)

query = session.query(Sale.agent_id,
                      Sale.property_id,
                      Property.address_zip,
                      # `subquery.as_scalar()` or
                      subquery.label('back_valuation'))\
        .join(Property)

Met behulp van as_scalar() beperkt geretourneerde kolommen en rijen tot 1, dus u kunt niet het hele modelobject gebruiken (als query(PropertyValuation) is een selectie van alle attributen van PropertyValuation ), maar krijgt alleen de waardering attribuut werkt.

Het is niet nodig om het later door te geven. Uw huidige manier om de subquery te declareren is prima zoals het is, aangezien SQLAlchemy automatisch correleren FROM-objecten met die van een omsluitende query . Ik heb geprobeerd modellen te maken die enigszins weergeven wat je hebt, en zo werkt de bovenstaande query (met toegevoegde regeleinden en inspringing voor de leesbaarheid):

In [10]: print(query)
SELECT sale.agent_id AS sale_agent_id,
       sale.property_id AS sale_property_id,
       property.address_zip AS property_address_zip,
       (SELECT property_valuations.valuation
        FROM property_valuations 
        WHERE property_valuations.zip_code = property.address_zip
        ORDER BY abs(datediff(property_valuations.as_of, sale.date_sold))
        LIMIT ? OFFSET ?) AS back_valuation 
FROM sale
JOIN property ON property.id = sale.property_id



  1. Kunnen er meerdere primaire sleutels op een enkele tafel bestaan?

  2. Items schrijven naar een MySQL-database in Scrapy

  3. Problemen met het aaneenschakelen van rijen met duplicaten

  4. Bestaande tabel verplaatsen van primaire bestandsgroep naar andere bestandsgroep