我想使用SQLAlchemy编写一个SQL Server的外部应用查询,如下所示。
FX表可能没有价格表中日期的相应行,因此我需要使用OUTER APPLY来获取每个日期的FX表中的最后一行。
SELECT p.EffectiveDate, p.Close_ * FX.Rate as USD_PRICE
FROM PRICE p
OUTER APPLY (
SELECT TOP 1 *
FROM FX
WHERE
FromCurrency = p.Currency
AND ToCurrency = 'USD'
AND ExRateDate <= p.EffectiveDate
ORDER BY ExRateDate DESC
) fx
表格的简要背景:
似乎SQLAlchemy不支持外部应用表达式。我看了Custom SQL Constructs and Compilation Extension。但我不知道如何创建外部应用的自定义构造。你有一个例子吗?
我想解决方法是用外连接替换外部应用。如果你可以提供一个查询可以产生相同的结果而不使用外部应用,那也可以解决我的问题。
由于
答案 0 :(得分:0)
使用Correlated Subquery这里是使用OUTER JOIN
的解决方案:
sq = (
session.query(FX.id.label("last_id"))
.filter(FX.FromCurrency == Price.Currency)
.filter(FX.ToCurrency == 'USD')
.filter(FX.ExRateDate <= Price.EffectiveDate)
.order_by(FX.ExRateDate.desc())
.order_by(FX.id.desc()) # handle duplicates just in case
.limit(1)
.correlate(Price)
.as_scalar()
)
q = session.query(
Price.EffectiveDate,
(Price.Close_ * FX.Rate).label("USD_PRICE"),
).outerjoin(FX, FX.id == sq)