Проблемы с более чем 1 левым соединением в MSAccess - PullRequest
3 голосов
/ 29 июня 2009

Это связано с моим предыдущим вопросом Более 1 левых соединений в MSAccess

Проблема в том, что у меня 3 левых соединения, за которыми следует оператор AND, чтобы проверить 1 условие.

Если я бегу, то получаю ошибку «Выражение соединения не поддерживается» .

Запрос выглядит так:

SELECT * FROM(( EMPLOYEE AS E  LEFT JOIN DEPARTMENT AS D ON E.EID=D.EID)
                 LEFT JOIN MANAGERS M ON D.DID=M.DID)
             LEFT JOIN MANAGERDETAILS MD  ON M.MDID=MD.MDID
 **AND E.ENO=MD.ENO**

Если я достану AND часть, она отлично работает.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 30 июня 2009

Я бы написал так:

SELECT EDM.*, MANAGERDETAILS.*
FROM (
    SELECT ED.*, MANAGERS.*
    FROM (
        SELECT EMPLOYEE.*, DEPARTMENT.*
        FROM EMPLOYEE
        LEFT JOIN DEPARTMENT
        ON EMPLOYEE.EID = DEPARTMENT.EID
    ) AS ED
    LEFT JOIN MANAGERS
    ON ED.DID = MANAGERS.DID
) AS EDM
LEFT JOIN MANAGERDETAILS
ON EDM.MDID = MANAGERDETAILS.MDID
    AND EDM.ENO = MANAGERDETAILS.ENO

По сути, вы объединяете таблицы по одной за раз и получаете псевдоним результат, который затем можете использовать для следующего объединения.

Вы можете добиться сколь угодно сложных левых соединений в Access только путем наложения псевдонимов меньшего размера. Возможно, ваше предложение о двойном соединении не работает, поскольку один из его членов ссылается на более глубокий набор результатов, чем тот, который виден на этом уровне запроса.

0 голосов
/ 29 июня 2009

Вам нужна вторая ссылка на таблицу Employee, поскольку вы пытаетесь получить запись сотрудника менеджера.

ВЫБРАТЬ * ОТ ( ( (СОТРУДНИК КАК ЕЕ ЛЕВЫЙ ОТДЕЛ СОЕДИНЕНИЯ КАК D НА E.EID = D.EID) ЛЕВЫЕ СОЕДИНЕННЫЕ МЕНЕДЖЕРЫ AS M ON D.DID = M.DID ) ЛЕВЫЙ РЕЙТИНГ МЕНЕДЖЕР ON M.DID = MD.MDID ) СЛЕДУЮЩИЙ СОТРУДНИК, КАК Е2 НА MD.ENO = E2.ENO;

У нас недостаточно информации о ожидаемых вами данных, но этот запрос будет выполнен.

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

0 голосов
/ 29 июня 2009

Вы пытаетесь сопоставить два поля в предложении ON, и любая из таблиц - MANAGERDETAILS.

Я не знаю, что вы пытаетесь получить с помощью этого sql, но вы можете либо поставить фильтр AND на правильное ON (после E.EID = D.EID), либо вы можете изменить таблицы, используемые для фильтрации в текущее ВКЛ, поэтому одно из полей принадлежит УПРАВЛЕНИЮ.

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