![](/img/trans.png)
[英]How to convert SQL with WHERE clause as subquery to SQLAlchemy
[英]How to convert SQL scalar subquery to SQLAlchemy expression
我需要一个litle帮助用SQLAlchemy语言表达我的代码,如下所示:
SELECT
s.agent_id,
s.property_id,
p.address_zip,
(
SELECT v.valuation
FROM property_valuations v WHERE v.zip_code = p.address_zip
ORDER BY ABS(DATEDIFF(v.as_of, s.date_sold))
LIMIT 1
) AS back_valuation,
FROM sales s
JOIN properties p ON s.property_id = p.id
内部子查询旨在从表propert_valuations
获取最接近表sales
日期的列( zip_code INT, valuation DECIMAL, as_if DATE
)的属性值。 我知道如何重写它,但我完全坚持order_by
表达式 - 我无法准备子查询以便稍后传递排序成员。
目前我有以下查询:
subquery = (
session.query(PropertyValuation)
.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).join(Sale.property_)
如何将这些查询组合在一起?
如何将这些查询组合在一起?
使用as_scalar()
或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)
使用as_scalar()
限制返回的行和列1,所以使用它,你不能得到整个模型对象(如query(PropertyValuation)
是一个选择的所有属性的PropertyValuation
),但得到的只是估值属性适用。
但是我完全坚持使用order_by表达式 - 我无法准备子查询以便稍后传递排序成员。
以后没有必要通过它。 您当前声明子查询的方式很好,因为SQLAlchemy可以自动将FROM对象与封闭查询的对象关联起来 。 我尝试创建有点代表你所拥有的模型,这里是上面的查询如何解决(添加了换行符和缩进以便于阅读):
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.