Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Хитрый запрос - срочно нужна помощь!  [new]
Peter
Guest
Составил запрос со множественными связями между таблицами. Проблема в том, что Access ругается: "не могу определить, в каком порядке связывать таблицы, разбейте на подзапросы". С подзапросами все работает, но мне надо в виде ОДНОГО запроса! Может как-то можно переконструировать этот запрос?

Теперь излагаю задачу. Моделируем учебный процесс: Группы, Предметы, Студенты, Экзамены.
Структура таблиц:

groups:
idGroup (PK)
textGroup

students:
idStudent (PK)
idGroup (FK -> groups)
fio

exams:
idExam (PK)
idStudent (FK)
idDiscipline (FK)
date
mark

disciplines:
idDiscipline (PK)
idGroup (FK)
textDiscipline


Необходимо составить запрос: Выбрать группы, все студенты которых сдали все экзамены на оценку >= 3.
(Примечание: если экзамен сдан на 2, то он может быть потом пересдан на другую оценку. Если экзамен не сдавался вообще, то соответствующей записи в exams вообще не будет).

Ниже _примерно_ как этот запрос должен выглядеть. Но:
1) Аксес не может в одном FROM скомбинировать INNER JOIN и LEFT JOIN
2) Перед присоединением таблицы exams из нее надо выкинуть все записи с оценкой < 3 (т.е. типа WHERE exams.mark < 3), чтобы исключить случаи, когда экзамен был пересдан на более высокую оценку.


SELECT
groups.textGroup

FROM
((groups
INNER JOIN students ON groups.idGroup = students.idGroup)
INNER JOIN disciplines ON groups.idGroup = disciplines.idGroup)
LEFT JOIN exams ON (students.idStudent = exams.idStudent) AND
(disciplines.idDiscipline = exams.idDiscipline)

GROUP BY
groups.textGroup

HAVING
MIN (IIF (ISNULL (exams.mark), 0, exams.mark)) > 2

ORDER BY
groups.textGroup;


Если кто сможет помочь, буду очень благодарен!
30 янв 02, 14:42    [464]     Ответить | Цитировать Сообщить модератору
 RE:Хитрый запрос - срочно нужна помощь!  [new]
Владимир Смирнов
Guest
Может так:
SELECT groups.textGroup
FROM groups
WHERE (((groups.idGroup) Not In (SELECT students.idGroup
FROM students LEFT JOIN exams ON students.idStudent = exams.idStudent
GROUP BY students.idGroup, students.idStudent
HAVING (Max(exams.mark) Is Null Or Max(exams.mark)<3)
)));
31 янв 02, 09:48    [465]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить