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

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

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

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

PAYMENTS
— date
— currency
— amount

RATES
— date
— currency
— rate

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

У меня получается так:
SELECT
  payments.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
        )
    )


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

Результат должен работать одновременно на SQLite и FireBird, поэтому желательно было бы получить ответ для SQL "вообще", а не для какого-то конкретного диалекта. По той же причине не хочется пользоваться хранимыми процеДурами, т.к. поддерживать одновременно два набора на разных диалектах маздай. По условиям задачи решить ее надо именно на уровне 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; как решать ее на уровне клиента, я понимаю