Конечно, это возможно - как SELECT это будет:
SELECT
b.BillDate,
r.RateDate,
r.ExchangeRate
FROM
Bill b
LEFT JOIN FxRate r ON r.RateDate = (
SELECT MAX(RateDate) FROM FxRate WHERE RateDate <= b.BillDate
)
Следовательно, как ОБНОВЛЕНИЕ:
UPDATE
Bill
SET
ReportingCurrency = r.ExchangeRate * b.Amount
FROM
Bill b
LEFT JOIN FxRate r ON r.RateDate = (
SELECT MAX(RateDate) FROM FxRate WHERE RateDate <= b.BillDate
)
Решение делает следующие предположения:
- никогда не бывает более одной
FxRate
записи за любой данный день
- существует запись
FxRate
, которая предшествует всем Bill
записям
Если эти предположения неприменимы, запрос должен быть удовлетворен.
Также обратите внимание, что это синтаксис SQL Server. Возможно, что Sybase немного отличается.
Поскольку комментатор проявил интерес к общему решению "ближайшей даты":
UPDATE
Bill
SET
ReportingCurrency = r.ExchangeRate * b.Amount
FROM
Bill b
LEFT JOIN FxRate r ON r.RateDate = (
SELECT TOP 1 RateDate
FROM FxRate
ORDER BY ABS(DATEDIFF(d, RateDate, b.BillDate)), RateDate
)
Хотя это будет довольно медленно. Альтернатива:
UPDATE
Bill
SET
ReportingCurrency = CASE
WHEN DATEDIFF(d, r1.RateDate, b.BillDate) <= DATEDIFF(d, b.BillDate, r2.RateDate)
THEN r1.ExchangeRate
ELSE COALESCE(r2.ExchangeRate, r1.ExchangeRate)
END * b.Amount
FROM
Bill b
LEFT JOIN FxRate r1 ON r1.RateDate = (
SELECT MAX(RateDate) FROM FxRate WHERE RateDate <= b.BillDate
)
LEFT JOIN FxRate r2 ON r2.RateDate = (
SELECT MIN(RateDate) FROM FxRate WHERE RateDate >= b.BillDate
)