У меня есть три таблицы, и я хочу:
Select
всех учащихся from
первой таблицы,
, которые имеют хотя бы одну связь со школой в округе '999' в вторая таблица
and
хотя бы одна связь с учителем с помощью social_number '101'
and
хотя бы одна связь с учителем с номером '103' в третьей таблице.
Таблицы связаны через вторую таблицу.
![my three tables](https://i.stack.imgur.com/A5uQH.png)
Я создал онлайн-компилятор sql, чтобы показать проблему: http://tpcg.io/FIoO79xi
Этот запрос работает нормально и, как и ожидалось, пока я не добавлю третью команду EXISTS
, где я ищу соединение с учителем «103». Тогда он больше не возвращает ученика А, хотя у него есть связь с учителем «103»
Я нашел обходной путь, добавив joins
в Exists sub-query
: http://tpcg.io/0sza7t5g
но так как в моих реальных таблицах базы данных много миллионов записей, это привело бы к объединению трех таблиц в каждой строке, через которую проходит sub-query
, и это может занять очень много времени, если он найдет подходящую запись только в конце Таблица.
Я думаю, что проблема здесь в sub-query
: WHERE th1.school_id = th.school_id
, где я пытаюсь найти связь между третьим учителем таблицы и таблицей в начале, соединенной вместе. Если я ищу соединение с учителем 102 вместо 103, запрос работает и возвращает ученика A: http://tpcg.io/2tHIEk3V Поскольку учителя 101 и 102 имеют один и тот же school_id.
Но как я могу напишите это по-другому, чтобы запрос также нашел ученика А, когда я ищу соединение с учителем 101 и 103? Студент А имеет связь с обоими, поэтому это должно быть как-то возможно с существующим ...
Добавить: Я не могу использовать три отдельных запроса, а затем использовать команду Intersect
для них, так как я перевод этого SQL
в JPA
запрос. JPA
не знает, пересекаются ...