Получение данных из связанных таблиц в Kotlin
Давайте сделаем запрос, который достанет всех
юзеров вместе с их городами. Для этого нужна
команда LEFT JOIN:
Ее синтаксис выглядит следующим образом:
SELECT поля FROM имя_таблицы
LEFT JOIN имя_связанной_таблицы ON условие_связи
WHERE условие_выборки
Давайте разберем отдельные части синтаксиса этой команды.
Поля
Так как выборка идет из нескольких таблиц,
выборка всех полей через * не будет
работать. Следующий запрос выберет поля только
из основной таблицы, но не из связанной:
SELECT *
Чтобы данные выбирались из всех таблиц, перед
* указывают имя таблицы для выборки:
SELECT users.*, cities.*
Либо перечисляют нужные поля с указанием имени таблицы перед ними:
SELECT users.name, cities.name
Эти два способа имеют проблему. Если поля
в таблицах имеют одинаковые имена, в результате
запроса произойдет конфликт имен и останется
только одно поле, а второго не будет. В Kotlin
колонку читают через getString, и второе
значение с тем же именем уже не достать.
Для решения проблемы конфликтные имена
переименовывают через команду AS:
SELECT users.name, cities.name AS city_name
Связь
После команды ON указывают поля из двух
таблиц, по которым осуществляется связь. В этом
случае это поле id из таблицы с городами
и поле city_id из таблицы с юзерами:
ON cities.id = users.city_id
Запрос
В итоге запрос, который достанет юзеров вместе с их городами, будет выглядеть следующим образом:
SELECT
users.name, cities.name AS city_name
FROM
users
LEFT JOIN cities ON cities.id = users.city_id
В Kotlin эту строку передают в executeQuery.
Колонку после AS читают по новому имени:
val result = statement.executeQuery(
"""
SELECT
users.name, cities.name AS city_name
FROM
users
LEFT JOIN cities ON cities.id = users.city_id
"""
)
while (result.next()) {
println(result.getString("name"))
println(result.getString("city_name"))
}
Пусть есть таблица с товарами и таблица с их категориями. Напишите запрос, который достанет названия товаров вместе с их категориями.