Комбинация LEFT и INNER JOIN
Есть у меня три таблицы t1, t2, t3. Записи из каждой таблицы могут ссылаться на предыдущую
CREATE TABLE t1 (
id INT NOT NULL PRIMARY KEY
);
CREATE TABLE t2 (
id INT NOT NULL PRIMARY KEY,
t1_id INT
);
CREATE TABLE t3 (
id INT NOT NULL PRIMARY KEY,
t2_id INT
);
INSERT INTO t1 (id) VALUES (1);
INSERT INTO t2 (id, t1_id) VALUES (1, 1);
INSERT INTO t2 (id, t1_id) VALUES (2, NULL);
INSERT INTO t3 (id, t2_id) VALUES (1, 1);
INSERT INTO t3 (id, t2_id) VALUES (2, 2);
INSERT INTO t3 (id, t2_id) VALUES (3, NULL);
Мне нужно вытащить записи из всех трех таблиц с двумя условиями
- Записей в
t2может не существовать - Если в
t2есть записи, то выбираются только те, которые ссылаются наt1
Т.е. должна получиться такая выборка
| t3.id | t2.id | t1.id |
|---|---|---|
| 1 | 1 | 1 |
| 3 | null | null |
Попробовал такой запрос
SELECT
*
FROM
t3
LEFT JOIN t2 ON (t3.t2_id = t2.id)
JOIN t1 ON (t2.t1_id = t1.id)
но получил только одну запись
| t3.id | t2.id | t1.id |
|---|---|---|
| 1 | 1 | 1 |
Моя задача решается таким запросом
SELECT
*
FROM
t3
LEFT JOIN t2 ON (t3.t2_id = t2.id)
LEFT JOIN t1 ON (t2.t1_id = t1.id)
WHERE
t2.id IS NULL OR
t2.t1_id IS NOT NULL
но мне не понятно, как же работает JOIN в комбинации с LEFT JOIN? К чему джойнятся записи? Или проблема в том, что записи не могут приджойниться к NULL, а порядок что к чему джойнится не определен?
Ссылка на DB Fiddle
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
Сильно похоже на
SELECT t3.id,t2.id,t1.id
FROM t3
JOIN t2 ON (t3.t2_id = t2.id)
JOIN t1 ON (t2.t1_id = t1.id)
UNION ALL
SELECT t3.id,NULL,NULL
FROM t3
LEFT JOIN t2 ON (t3.t2_id = t2.id)
WHERE t2.id IS NULL
Автор решения: Герман Борисов
→ Ссылка
SELECT
t3.id t3_id,
t2.id t2_id,
t1.id t1_id
FROM
t3
LEFT JOIN (t2 INNER JOIN t1 ON t2.t1_id = t1.id) ON t3.t2_id = t2.id
Выполняем LEFT JOIN между T3 и результатом INNER JOINа T2 и T1