Внутреннее соединение можно выполнить не используя ключевое слово JOIN
. Для этого достаточно сделать декартово произведение строк таблиц, а условия соединения прописать в предложении WHERE
. Например, соединим таблицы городов и часовых поясов:
SELECT c.name AS city_name,
c.timezone_id AS timezone_id_city,
t.timezone_id AS timezone_id_timezone,
t.time_offset
FROM city c,
timezone t
WHERE t.timezone_id = c.timezone_id
ORDER BY c.name, t.timezone_id
city_name | timezone_id_city | timezone_id_timezone | time_offset |
---|---|---|---|
Барнаул | 5 | 5 | UTC+6 |
Владивосток | 8 | 8 | UTC+10 |
Иркутск | 7 | 7 | UTC+8 |
Калининград | 1 | 1 | UTC+2 |
Кемерово | 6 | 6 | UTC+7 |
Такая форма соединения таблиц не отличается от соединения через JOIN
по производительности, но удобнее в запросах с большим количеством таблиц. Сравни:
SELECT r.name AS rank_name,
s.name AS store_name,
c.name as city_name,
sa.address,
t.time_offset
FROM rank r
JOIN store s
ON s.store_id = r.store_id
JOIN store_address sa
ON sa.store_id = s.store_id
JOIN city c
ON c.city_id = sa.city_id
JOIN timezone t
ON t.timezone_id = c.timezone_id
и
SELECT r.name AS rank_name,
s.name AS store_name,
c.name as city_name,
sa.address,
t.time_offset
FROM rank r,
store s,
store_address sa,
city c,
timezone t
WHERE s.store_id = r.store_id
AND sa.store_id = s.store_id
AND c.city_id = sa.city_id
AND t.timezone_id = c.timezone_id
Нам больше нравится второй вариант, т.к. запрос получается менее загруженным ключевыми словами и лучше видно из каких таблиц выбираются данные. Есть и обратная сторона - условия соединения отделены от таблиц. Но эта проблема становится не такой актуальной при одинаковом порядке таблиц в FROM
и условий в WHERE
.