Какое максимальное количество записей можно получить при right join между таблицами пользователей и должностей
Что проверяют
Понимаете ли вы, что число строк в результате соединения определяют не размеры таблиц, а условие и кратность связи. Следом обычно просят назвать минимум и показать, как то же размножение строк проявляется в JPA.
Как отвечать
Пусть в users U строк, в positions P строк, запрос users RIGHT JOIN positions. RIGHT JOIN гарантирует, что каждая должность попадёт в результат хотя бы раз, отсюда минимум: P строк.
Максимум зависит от условия:
- в общем случае U × P: если условие истинно для любой пары, например
ON trueили сравнение по неуникальной колонке, соединение вырождается в декартово произведение; - при обычной схеме, где
users.position_idссылается наpositions.id: каждый пользователь совпадает не больше чем с одной должностью, а должности без людей добавляются по одной строке сNULLв колонках пользователя. Максимум получается, когда все пользователи сидят на одной должности: U строк плюс по строке на каждую из остальных, пустых должностей, то есть на одну меньше, чем U + P; - пользователи без должности (
position_id IS NULL) вRIGHT JOINне попадают вовсе, это частая ловушка при подсчётах.
Для Java-разработчика стоит связать это с ORM. Связь @ManyToOne у User и @OneToMany у Position, а join fetch коллекции размножает строки так же: должность приходит столько раз, сколько у неё людей. Hibernate 6 сам убирает повторы корневых сущностей, но при пагинации с fetch-коллекцией предупреждает, что применит setFirstResult/setMaxResults в памяти, то есть выгрузит всё.
И про стиль: RIGHT JOIN почти всегда переписывают в LEFT JOIN, поменяв таблицы местами. Запрос читается слева направо, смешанные соединения путают.
Где спотыкаются
Говорят, что максимум равен числу строк правой таблицы. Это минимум, а сверху результат ограничен кратностью связи.
Путают стороны: ждут NULL у пользователей без должности, хотя при RIGHT JOIN NULL появляются в колонках пользователя у должностей без людей.
Считают на одном примере с числами и не называют условий, при которых ответ меняется: уникальность ключа, внешний ключ, NULL в колонке связи.