Сообщение SQL: как построить запрос от 23.02.2017 13:26
Изменено 23.02.2017 13:38 sushko
SQL: как построить запрос
Есть две таблицы:
PAYMENTS
— date
— currency
— amount
RATES
— date
— currency
— rate
Как построить запрос, выводящий список сумм платежей в базовой валюте по курсу на дату платежа?
У меня получается так:
Получается два вложенных селекта, что (zope'ой чувствую) напряжет БД (как минимум FireBird) до изнеможения на большом наборе данных. Можно ли как-то решить этот вопрос проще?
Результат должен работать одновременно на SQLite и FireBird, поэтому желательно было бы получить ответ для SQL "вообще", а не для какого-то конкретного диалекта. По той же причине не хочется пользоваться хранимыми процеДурами, т.к. поддерживать одновременно два набора на разных диалектах маздай. По условиям задачи решить ее надо именно на уровне SQL; как решать ее на уровне клиента, я понимаю Вопросы NULL'ов, неправильных наименований полей (название поля "date" может оказаться ключевым словом в каком-нибудь диалекте 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
Как построить запрос, выводящий список сумм платежей в базовой валюте по курсу на дату платежа?
У меня получается так:
Получается два вложенных селекта, что (zope'ой чувствую) напряжет БД (как минимум FireBird) до изнеможения на большом наборе данных. Можно ли как-то решить этот вопрос проще?
При этом:
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) и т.п. мы опускаем для упрощения.