Помогите с проблемой, с которой я столкнулся, чтобы правильно соединить несколько таблиц в одном запросе.Как иметь левое соединение, включающее дополнительный запрос?
Упрощенная схема выглядит следующим образом:
TRANSACTION TABLE:
-----------------
TRANSACTION_DATE AMOUNT CURRENCY
---------------- ---------- --------
22/09/13 100 EUR
22/09/13 200 FRA
22/09/13 200 GBP
CURRENCY_CONVERSION TABLE:
-------------------------
FROM_CURRENCY TO_CURRENCY CONVERSION_DATE CONVERSION_RATE
------------- ----------- --------------- ---------------
GBP USD 23/09/13 1.61
EUR USD 22/09/13 1.35
В настоящее время запрос, который работает следующим образом (с использованием Sybase/SQL Server синтаксис объединения)
SELECT
t.transaction_date,
t.amount,
t.currency,
t.amount * cc.conversion_rate as amount_usd
FROM transaction t, currency_conversion cc,
WHERE t.transaction_date *= cc.conversion_date
AND t.currency *= cc.from_currency
AND cc.to_currency = 'USD'
Мы сталкиваемся вопрос в приведенном выше запросе, когда currency_conversion таблица может не иметь коэффициента конверсии для определенных дат. В этом случае недостающее значение бизнес хочет использовать последний последний коэффициент конверсии, доступный в БД. Например, если курс евро к доллару на сегодняшний день недоступен, используйте вчерашний курс. Я стараюсь сделать это следующим образом:
SELECT
t.transaction_date,
t.amount,
t.currency,
t.amount * cc.conversion_rate as amount_usd
FROM transaction t, currency_conversion cc,
WHERE t.transaction_date *=
(SELECT max(c1.conversion_date) FROM currency_conversion c1
WHERE c1.from_currency = t.from_currency
AND c1.to_currency = 'USD')
AND t.currency *= cc.from_currency
AND cc.to_currency = 'USD'
Этот запрос не работает. Левое соединение на t.transaction_date является незаконным. Это будет работать, если я отпущу объединение, но затем я пропущу некоторые транзакции в конечном результате.
Просьба сообщить.
Пожалуйста, обратите внимание, что:
- его важно для того чтобы достигнуть этого в одном запросе (два шага решения с двумя запросами не поможет)
- используется БД Sybase 12, хотя я думаю, что это общий материал SQL
- это упрощенная схема, в фактическом запросе я использую еще два таких преобразования для доллара США, требуемых для разных сумм
- , если возможно, предложите решение вокруг существующего que чень с минимальными изменениями
Спасибо за ваше время.
изменение тегов - не нужно помещать метки oracle и mssql2008 в вопрос sybase/sql. Вы хотите иметь максимальную логику на уровне таблицы в инструкции from не в предложении where. Можете ли вы предположить, что обменный курс, который вы хотите, всегда является самым последним – Twelfth
SInce SYbase и SQl Server основаны на одном и том же движке, я бы очень опасался использования синтаксиса implict для левых объединений. Он иногда приводил неверные результаты на сервере SQl (BAck в SQL Server 200, когда он был еще разрешен) когда-то интерпретировал его как кросс-соединение. Infact. Это antipatter SQL для использования соединений implict вообще, и вы действительно должны прекратить использовать эту проакцию для всех запросов. – HLGEM
PArt вашей проблемы - плохой дизайн стола. Если в вашей таблице конверсии валют были начальные и конечные даты, было бы проще запросить. – HLGEM