Я использую Access 2003 и делаю запрос на создание таблицы.
Идея в том, что у меня есть несколько таблиц, содержащих всевозможную информацию в списке фондов, и я пытаюсь объединить их. Все таблицы имеют FundID в качестве одного из полей, и это поле, которое мы используем для идентификации каждого отдельного фонда. Там есть таблица для поля MER, которые время от времени обновляются. Таким образом, мы должны применить значения MER для соответствующих периодов. Вот мой код SQL:
SELECT
[Fund Mapping].FundID,
[Fund Mapping].FundName,
[MarketValues].DateLookup,
[MarketValues].[SumOfCurrentAmt]/100 AS [MV By Fund],
[Fund Prices @ Month End].Price,
IIf([MarketValues].DateLookup<"200908",[MER (08 to Jul 09)].MER,
IIf([MarketValues].DateLookup<"200911",[MER (Aug 09 to Oct 09)].MER,
IIf([MarketValues].DateLookup<"201008",[MER (Nov 09 to Jul 10)].MER,
IIf([MarketValues].DateLookup<"201106",[MER (Aug 10 to May 11)].MER,[MER (Jun 11 to present)].MER)
)
)
) AS MER
INTO [Fund Data]
FROM [Fund Mapping],
[MER (08 to Jul 09)] RIGHT JOIN
([MER (Aug 09 to Oct 09)] RIGHT JOIN
([MER (Nov 09 to Jul 10)] RIGHT JOIN
([MER (Aug 10 to May 11)] RIGHT JOIN
([MER (Jun 11 to present)] RIGHT JOIN
([MarketValues] INNER JOIN [Fund Prices @ Month End]
ON ([MarketValues].DateLookup = [Fund Prices @ Month End].DateLookup)
AND ([MarketValues].FundID = [Fund Prices @ Month End].[Fund ID]))
ON [MER (Jun 11 to present)].FundID = [MarketValues].FundID)
ON [MER (Aug 10 to May 11)].FundID = [MarketValues].FundID)
ON [MER (Nov 09 to Jul 10)].FundID = [MarketValues].FundID)
ON [MER (Aug 09 to Oct 09)].FundID = [MarketValues].FundID)
ON [MER (08 to Jul 09)].FundID = [MarketValues].FundID
GROUP BY
[Fund Mapping].FundID,
[Fund Mapping].FundName,
[MarketValues ].DateLookup,
[SumOfCurrentAmt]/100,
[Fund Prices @ Month End].Price,
IIf([MarketValues].DateLookup<"200908",[MER (08 to Jul 09)].MER,
IIf([MarketValues].DateLookup<"200911",[MER (Aug 09 to Oct 09)].MER,
IIf([MarketValues].DateLookup<"201008",[MER (Nov 09 to Jul 10)].MER,
IIf([MarketValues].DateLookup<"201106",[MER (Aug 10 to May 11)].MER,[MER (Jun 11 to present)].MER)
)
)
)
ORDER BY
[Fund Mapping].FundID,
[MarketValues].DateLookup;
DateLookup - строки в формате ГГГГММ. Причина, по которой я использую RIGHT JOIN вместо INNER JOIN, заключается в том, что могут быть добавлены новые средства, поэтому в более ранних таблицах MER не будут все идентификаторы FundID. Таблица «MarketValues INNER JOIN Fund Prices @ Month End» должна быть основой всего этого - в ней есть все средства, и из этого ничего не должно быть исключено.
Когда я пытался сохранить запрос, он выдавал мне сообщение об ошибке, в котором говорилось, что выражение JOIN не поддерживается. Я не знаю, что не так или как я могу это исправить.
Помогите пожалуйста? Заранее спасибо!
========== ОБНОВЛЕНИЕ # 1
Я вручную добавил каждое из свойств объединения и весь запрос с нуля в режиме конструктора. Он дал мне почти тот же код, что и выше, но позволил мне сохранить (код выше дает мне ошибку всякий раз, когда я пытаюсь сохранить).
Но когда я пытался выполнить запрос, он выдает мне сообщение об ошибке, в котором говорится: «Невозможно выполнить инструкцию SQL, поскольку она содержит неоднозначные внешние объединения. Чтобы сначала было выполнено одно из соединений, создайте отдельное запрос, который выполняет первое соединение, а затем включает этот запрос в оператор SQL. "
Нет ли другого пути?
========== ОБНОВЛЕНИЕ № 2
Так что я покопался немного дальше и смог решить проблему и правильно выполнить запрос.
Оказывается, все, что мне нужно было сделать, это присоединиться к столу [Fund Mapping] вместе со всеми другими столами! То есть все таблицы, из которых я выбираю, объединяются.
Просто подумал, что я должен дать обновление на случай, если кто-то еще столкнется с той же проблемой.
Спасибо за помощь!