Левое соединение вместе с внутренним соединением в ms-access - PullRequest
4 голосов
/ 20 апреля 2011

Я должен выполнить следующий запрос в базе данных доступа:

    SELECT School.Name, Student.Name, Grade.Grade
    FROM( (`School` `School` LEFT JOIN `Student` `Student` ON `School`.`ID`=`Student`.`SchoolID`) INNER JOIN `Grade` `Grade` ON `Student`.`GradeID` = `Grade`.`ID`)

Это дает мне ошибку "Выражение соединения не поддерживается", но если я изменю LEFT JOIN на INNER JOIN, он будет работать правильно Я думаю, что способ использования обоих этих объединений в ms-access может быть различным. Может кто-нибудь, пожалуйста, скажите мне, что не так в этом запросе и / или причина, по которой это не поддерживается.

Спасибо

Ответы [ 3 ]

7 голосов
/ 20 апреля 2011

Я заново создал ваш запрос в конструкторе запросов Access. Как вы обнаружили, запрос работал с обоими объединениями как INNER. Однако дизайнер запросов пожаловался на «неоднозначное внешнее соединение», когда я попытался переключить первое INNER JOIN на LEFT JOIN. LEFT для обоих объединений работает, как и INNER для обоих.

Если вам нужно LEFT для первого соединения и INNER для второго, вы можете переместить таблицы из второго соединения в подзапрос.

SELECT
    School.[Name] AS school_name,
    sub.[Name] AS student_name,
    sub.Grade
FROM
    School LEFT JOIN (
        SELECT
            Student.SchoolID,
            Student.[Name],
            Grade.Grade
        FROM
            Student INNER JOIN Grade
            ON Student.GradeID = Grade.ID) AS sub
    ON School.ID = sub.SchoolID;
2 голосов
/ 20 апреля 2011

Student. GradeID может быть нулевым, потому что вы сделали ЛЕВОЕ СОЕДИНЕНИЕ для ученика, оно может не существовать для вашего второго соединения.

Поэтому, в принципе, всякий раз, когда вы делаете ЛЕВОЕ СОЕДИНЕНИЕ, вы неиспользуйте любой из этих столбцов TABLES в будущем JOINS

0 голосов
/ 20 апреля 2011

Синтаксис from и join неверен.

SELECT School.Name, Student.Name, Grade.Grade
FROM Grade
 left join Student on ...
 left join School on  ...

Где "..." - это "<первичный ключ> = <внешний ключ>".

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