Написать SQL(ORACLE) запрос /\ Необходимо вывести студентов сдавших экзамены по двум иностранным языкам на «отлично»

Рейтинг: 0Ответов: 1Опубликовано: 23.02.2023

Помогите пожалуйста организовать правильно запрос. Он разрабатывается на чистом SQL(Oracle)

Необходимо вывести студентов сдавших экзамены по двум иностранным языкам на «отлично». Предлагаем следующий алгоритм:

a. Шаг 1. Определим номер кафедры иностранного языка (ch_chair_id) из таблицы chairs.

b. Шаг 2. Необходимо получить идентификаторы всех преподавателей кафедры (t_id) из таблицы teachers.

c. Шаг 3. Используя многострочный подзапрос, определим список идентификаторов предметов (sb_id) из таблицы subjects, которые читаются этими преподавателями.

d. Шаг 4. Из таблицы marks определим студентов (m_student_id) сдавших предметы на пять.

e. Шаг 5. И наконец, из таблицы students найдём группу (st_group), фамилию (st_surname) и имя (st_name) этих студентов.

Я создал несколько таблиц, но не могу разобраться, как правильно скомпоновать запрос. У меня даже идей нет, с чего начать.

 CREATE TABLE subjects
(
sb_id NUMBER(3),
sb_subject VARCHAR2(40),
sb_teacher_id NUMBER(4),
sb_load NUMBER(3) DEFAULT 0
);

CREATE TABLE students
(
st_record_book NUMBER(6),
st_name VARCHAR2(20),
st_patronymic VARCHAR2(20),
st_surname VARCHAR2(20),
st_birthday DATE,
st_sex CHAR(1),
st_living_place VARCHAR2(20),
st_group VARCHAR2(7)
);

CREATE TABLE teachers
(t_id NUMBER(4),
t_name VARCHAR2(20),
t_patronymic VARCHAR2(20),
t_surname VARCHAR2(20),
t_birthday DATE,
t_sex CHAR(1),
t_living_place VARCHAR2(20),
t_chair_id NUMBER(2),
t_manager_id NUMBER(4),
t_position VARCHAR2(20) NOT NULL,
t_salary NUMBER(4)
);

CREATE TABLE chairs
(
ch_chair_id NUMBER(2),
ch_name VARCHAR2(20) NOT NULL,
ch_manager_id NUMBER(4),
ch_phone VARCHAR2(8)
);

CREATE TABLE marks(
    m_student_id NUMBER(6),
    m_subject_id NUMBER(3),
    m_mark NUMBER(1)
); 

P.S. Шось я с температурой совсем отупел, благодарю за уделенное время!)

Ответы

▲ 1Принят

Примерно такое решение:

SELECT st_group, st_surname, st_name
FROM students
WHERE st_record_book IN (
    SELECT m_student_id
    FROM marks
    WHERE m_mark = 5
    AND m_subject_id IN (
        SELECT sb_id
        FROM subjects
        WHERE sb_teacher_id IN (
            SELECT t_id
            FROM teachers
            WHERE t_chair_id IN (
                SELECT ch_chair_id
                FROM chairs
                WHERE ch_name LIKE '%Иностранный язык%'
            )
        )
        GROUP BY sb_id
        HAVING COUNT(DISTINCT sb_teacher_id) >= 2
    )
);