Em docs , a junção da parte não recursiva com a recursiva é feita via CROSS JOIN
. Existe algum benefício em usá-lo em vez de INNER JOIN
? É apenas uma escolha subjetiva?
CREATE TEMPORARY TABLE folders (id INT, parent INT) ON COMMIT DROP;
INSERT INTO folders
(id, parent)
VALUES
(1, null),
(2, 1),
(3, 2);
usandoCROSS JOIN
WITH RECURSIVE tree (id, parent) AS (
SELECT id, parent
FROM folders
WHERE id = 3
UNION ALL
SELECT p.id, p.parent
FROM folders p, tree
WHERE tree.parent = p.id
)
usandoINNER JOIN
WITH RECURSIVE tree (id, parent) AS (
SELECT id, parent
FROM folders
WHERE id = 3
UNION ALL
SELECT p.id, p.parent
FROM folders p
INNER JOIN tree
ON tree.parent = p.id
)
Independente do contexto CTE, os itens separados por vírgulas na
FROM
lista são equivalentes ao mesmo queCROSS JOIN
substituir as vírgulas. E[INNER] JOIN
é exatamente o mesmo queCROSS JOIN
com umaWHERE
cláusula. O manual:Mas há uma diferença sutil entre vírgula e
JOIN
sintaxe explícita. A vírgula separa mais estritamente. Ver:Como @Bijujose sugeriu, a aparência
CROSS JOIN
realmente atua como umINNER JOIN
(levando em conta atree.parent = p.id
condição de junção) e, portanto, não há diferença semântica.EXPLAIN ANALYZE
saída para cada: