Não costumo ver a cláusula ON usada com as junções LATERAL (PostgreSQL 11+). Por exemplo, a documentação oficial tem este exemplo:
Um exemplo trivial de LATERAL é
SELECT * FROM foo, LATERAL (SELECT * FROM bar WHERE bar.id = foo.bar_id) ss;
Isso não é especialmente útil, pois tem exatamente o mesmo resultado que o mais convencional
SELECT * FROM foo, bar WHERE bar.id = foo.bar_id;
A partir do exemplo, a junção convencional equivalente tem uma cláusula ON (escrita usando WHERE, WHERE bar.id = foo.bar_id
), mas para a LATERAL JOIN, a condição de junção parece ser "internalizada".
Sinto que este exemplo não está sozinho. Vejo muitos usos de junção lateral sem uma cláusula ON, mas não vejo muito uso com uma cláusula ON. Conceitualmente, não está claro se uma cláusula ON é necessária para uma junção lateral, pois cada conjunto de valores dependentes é associado apenas às linhas das quais eles dependiam. Usando o próximo exemplo da mesma documentação para ilustrar:
Por exemplo, supondo que vertices(polygon) retorne o conjunto de vértices de um polígono, poderíamos identificar vértices próximos de polígonos armazenados em uma tabela com:
SELECT p1.id, p2.id, v1, v2
FROM polygons p1, polygons p2,
LATERAL vertices(p1.poly) v1,
LATERAL vertices(p2.poly) v2
WHERE (v1 <-> v2) < 10 AND p1.id != p2.id;
Aqui, o conjunto de vértices gerado para cada polígono p1.poly
está associado apenas a esse polígono, não a nenhum outro polígono. Não parece ser necessário especificar a correlação entre o resultado calculado e o polígono original usando uma cláusula ON. A "condição de junta" parece estar implicada na dependência dos pilares na junta lateral.
Não consegui encontrar confirmação na documentação vinculada se uma cláusula ON é necessária ou mesmo permitida para um LATERAL JOIN. Daí esta pergunta:
Um LATERAL JOIN requer/permite uma condição de junção (uma cláusula ON)?
Sim, basta se livrar da forma antiga de listar tabelas na cláusula FROM separadas por vírgulas:
O ??? marca a posição em que sua consulta original perdeu uma condição de junção entre v1 e p1 ou p2
Eu não acho que LATERAL muda nada aqui.
Uma junção de vírgula ou um CROSS JOIN não pode ter ON (e você precisa preencher as condições no WHERE se houver), enquanto outros tipos de JOIN explícitos exigem um ON ou USING. (Estou ignorando o NATURAL JOIN, como ele merece.)
Se você deseja retornar uma linha estendida NULL no caso em que a junção lateral não retorna nenhuma linha, você usaria
LEFT JOIN LATERAL (...) ON TRUE
. Qualquer condição diferente de TRUE não é necessária, pois você poderia ter apenas escrevê-la na própria subconsulta (mas talvez pareça melhor colocar algo no ON, se aumentar o paralelismo com outras consultas que você também precisa manter, ou se apenas separa bem a lógica entre qual linha retornar e se deve retornar qualquer linha)Mas não há razão absoluta para usar
JOIN LATERAL (...) ON TRUE
, porque você pode simplesmente escrevê-lo como um CROSS JOIN LATERAL. Mas, novamente, pode "parecer melhor" de uma maneira versus a outra.