Нет, они не эквивалентны. Пример:
CREATE TABLE a
( keya int ) ;
CREATE TABLE b
( keyb int ) ;
CREATE TABLE c
( keyc int ) ;
INSERT INTO a
VALUES
(1) ;
INSERT INTO b
VALUES
(1),(2) ;
INSERT INTO c
VALUES
(2) ;
Результаты:
SELECT *
FROM a
LEFT JOIN b
ON a.keya = b.keyb
INNER JOIN c
ON c.keyc = b.keyb ;
Result
----------------------
| keya | keyb | keyc |
----------------------
SELECT *
FROM a
LEFT JOIN
( SELECT b.*, c.*
FROM b
INNER JOIN c
ON c.keyc = b.keyb
) sub
ON a.keya = sub.keyb ;
Result
----------------------
| keya | keyb | keyc |
----------------------
| 1 | NULL | NULL |
----------------------
Что касается того, почему это происходит, a LEFT JOIN b INNER JOIN c
анализируется как (a LEFT JOIN b) INNER JOIN c
, что эквивалентно (a INNER JOIN b) INNER JOIN c
, поскольку условие объединения INNER
отменяет соединение LEFT
.
Вы также можете написать второй запрос в этой форме - без подзапроса - который анализируется как a LEFT JOIN (b INNER JOIN c)
из-за различного размещения предложений ON
:
SELECT *
FROM a
LEFT JOIN
b
INNER JOIN c
ON c.keyc = b.keyb
ON a.keya = b.keyb ;
Result
----------------------
| keya | keyb | keyc |
----------------------
| 1 | NULL | NULL |
----------------------