Комбинация 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);

Мне нужно вытащить записи из всех трех таблиц с двумя условиями

  1. Записей в t2 может не существовать
  2. Если в 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

→ Ссылка