У меня есть три таблицы и я хочу:
Select
все студенты from
первый стол,
которые имеют хотя бы одну связь со школой в округе «999» во второй таблице.
and
хотя бы одно подключение к учителю с социальным_номером '101'
and
хотя бы один учителю с номером «103» в третьей таблице.
Таблицы связаны через вторую таблицу.
Я создал онлайн-компилятор 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
не знает пересечения...