Информация об изменениях

Сообщение SQL: как построить запрос от 23.02.2017 13:26

Изменено 23.02.2017 13:38 sushko

SQL: как построить запрос
Есть две таблицы:

PAYMENTS
— date
— currency
— amount

RATES
— date
— currency
— rate

Как построить запрос, выводящий список сумм платежей в базовой валюте по курсу на дату платежа?

У меня получается так:
SELECT amount *     
    (
    SELECT rate FROM rates WHERE rates.currency=payments.currency AND rates.date=
        (
        SELECT MAX(date) FROM rates WHERE rates.currency=payments.currency AND rates.date<=payments.date
        )
    )
FROM payments


Получается два вложенных селекта, что (zope'ой чувствую) напряжет БД (как минимум FireBird) до изнеможения на большом наборе данных. Можно ли как-то решить этот вопрос проще?

Результат должен работать одновременно на SQLite и FireBird, поэтому желательно было бы получить ответ для SQL "вообще", а не для какого-то конкретного диалекта. По той же причине не хочется пользоваться хранимыми процеДурами, т.к. поддерживать одновременно два набора на разных диалектах маздай. По условиям задачи решить ее надо именно на уровне SQL; как решать ее на уровне клиента, я понимаю Вопросы NULL'ов, неправильных наименований полей (название поля "date" может оказаться ключевым словом в каком-нибудь диалекте SQL) и т.п. мы опускаем для упрощения.
SQL: как построить запрос
Есть две таблицы:

PAYMENTS
— date
— currency
— amount

RATES
— date
— currency
— rate

Как построить запрос, выводящий список сумм платежей в базовой валюте по курсу на дату платежа?

У меня получается так:
SELECT amount *     
    (
    SELECT rate FROM rates WHERE rates.currency=payments.currency AND rates.date=
        (
        SELECT MAX(date) FROM rates WHERE rates.currency=payments.currency AND rates.date<=payments.date
        )
    )
FROM payments


Получается два вложенных селекта, что (zope'ой чувствую) напряжет БД (как минимум FireBird) до изнеможения на большом наборе данных. Можно ли как-то решить этот вопрос проще?

При этом:
    Результат должен работать одновременно на SQLite и FireBird, поэтому желательно было бы получить ответ для SQL "вообще", а не для какого-то конкретного диалекта.
    По той же причине не хочется пользоваться хранимыми процеДурами.
    По условиям задачи решить ее надо именно на уровне SQL; как решать ее на уровне клиента, я понимаю
    Вопросы NULL'ов, неправильных наименований полей (название поля "date" может оказаться ключевым словом в каком-нибудь диалекте SQL) и т.п. мы опускаем для упрощения.