Ошибка 3296: выражение соединения не поддерживается в MS Access Query с несколькими JOIN - PullRequest
1 голос
/ 02 марта 2012

Я использую 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] вместе со всеми другими столами! То есть все таблицы, из которых я выбираю, объединяются.

Просто подумал, что я должен дать обновление на случай, если кто-то еще столкнется с той же проблемой.

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Я думаю, что проблема заключается в смешении перекрестного соединения "старого стиля" со стилем инфиксного соединения, например, рассмотрим этот упрощенный пример, который генерирует ту же ошибку:

SELECT *
 FROM T1, T2 RIGHT JOIN T3 ON T2.c = T3.c;

Одно простое исправление вышеупомянутого - выполнить RIGHT JOIN в другом объеме, например, в производном:

SELECT * 
  FROM T1, (
            SELECT T2.*, T3.c2
              FROM T2 RIGHT JOIN T3 ON T2.c = T3.c
           ) AS DT1;
0 голосов
/ 28 марта 2012

См. Обновление № 2 для решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...