Тройной подзапрос PostgreSQL
Есть небольшая база данных, в ней кусок из трех таблиц
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
first_name CHARACTER VARYING(30),
last_name CHARACTER VARYING(30)
);
CREATE TABLE courses
(
course_id SERIAL PRIMARY KEY,
course_name CHARACTER VARYING(30),
);
CREATE TABLE students_courses
(
student_course_id SERIAL PRIMARY KEY,
student_id INTEGER REFERENCES students (student_id),
course_id INTEGER REFERENCES courses (course_id)
);
Мне нужно выводить всех студентов, у которых есть введенный мною курс. Я пытался сделать это через тройной подзапрос:
SELECT first_name, last_name
FROM students
WHERE student_id = (SELECT student_id
FROM students_courses
WHERE course_id = (SELECT course_id
FROM courses
WHERE course_name = 'Math'));
Но мне выдает "ОШИБКА: подзапрос в выражении вернул больше одной строки".
Это происходит уже при выполнении самого "верхнего" запроса, так как при выполнении только 2 внутренних я получаю таблицу с айдишниками студентов, как на скрине 
Я понимаю, что проблема в том, что подзапрос возвращает не одно значение, а сразу несколько, но я не могу понять, как можно по другому получить имена студентов.
P.S. Я также понимаю, что проще сделать это через код, занести айди студентов в резалтСет и пройтись по нему, подбирая имена, но хотелось бы понять, как это можно сделать имея лишь консоль СУБД под рукой
Ответы (1 шт):
Используйте in в подзапросах
SELECT first_name, last_name
FROM students
WHERE student_id IN (SELECT student_id
FROM students_courses
WHERE course_id IN (SELECT course_id
FROM courses
WHERE course_name = 'Math'));
либо по человечески оформить этот запрос
SELECT students.first_name, students.last_name
FROM students
INNER JOIN students_courses
ON students_courses.student_id = students.student_id
INNER JOIN courses
ON students_courses.course_id = courses.course_id
WHERE courses.course_name = 'Math';