Как выполнить внутреннее объединение для этого запроса - PullRequest
0 голосов
/ 24 марта 2020

Может ли кто-нибудь помочь мне решить проблему с моим синтаксисом? Я потратил на него 1 час, но не могу понять.

У меня есть 3 таблицы:

**Student**

-ID (UUID)

email (String)

**Teacher**

-ID (UUID)

email (String)

**StudentTeacher**

-ID (UUID)

studentId (UUID)

teacherId (UUID)

У меня есть запрос инициализации, который возвращает некоторый studentId

SELECT studentId FROM TeacherStudents WHERE teacherId IN ('123', '456') GROUP BY studentId HAVING COUNT(DISTINCT teacherId) = 2

Я хотел бы объединить результаты с таблицей студентов, чтобы я мог вернуть адрес электронной почты

Однако, это не работает

SELECT email FROM TeacherStudents WHERE teacherId IN ('123', '456') GROUP BY studentId HAVING COUNT(DISTINCT teacherId) = 2 INNER JOIN Students on TeacherStudents.studentId = Students.id

Возвращает ошибку.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Обобщенный случай, чтобы получить все столбцы из таблицы Student ...

SELECT
  Students.*
FROM
(
  SELECT studentId
    FROM TeacherStudents
   WHERE teacherId IN ('123', '456')
GROUP BY studentId
  HAVING COUNT(DISTINCT teacherId) = 2
)
  StudentsOfInterest
INNER JOIN
  Students
    ON StudentsOfInterest.studentId = Students.id
1 голос
/ 24 марта 2020

Правильный синтаксис:

SELECT s.studentId, s.email
FROM TeacherStudents ts JOIN
     Students s
     ON ts.studentId = s.id
WHERE ts.teacherId IN (123, 456)
GROUP BY s.studentId, s.email
HAVING COUNT(DISTINCT ts.teacherId) = 2 ;

Примечания:

  • WHERE - это предложение SQL, следующее за предложением FROM.
  • JOIN s - это оператор в предложении FROM.
  • TeacherId, вероятно, число, поэтому не используйте одинарные кавычки.
  • Псевдонимы таблицы упростите написание и чтение запроса.
  • Вы изучаете SQL, поэтому убедитесь, что неагрегированные столбцы в SELECT соответствуют GROUP BY. Вы можете удалить s.studentId из SELECT, если действительно хотите.
  • Уточните все имена столбцов, чтобы вы знали, из какой таблицы они происходят.
...