AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 301884
Accepted
tinlyx
tinlyx
Asked: 2021-10-30 06:57:57 +0800 CST2021-10-30 06:57:57 +0800 CST 2021-10-30 06:57:57 +0800 CST

As junções LATERAL do PostgreSQL requerem ou permitem uma cláusula ON?

  • 772

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.polyestá 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)?

postgresql lateral-join
  • 2 2 respostas
  • 363 Views

2 respostas

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2021-10-30T07:49:34+08:002021-10-30T07:49:34+08:00

    Sim, basta se livrar da forma antiga de listar tabelas na cláusula FROM separadas por vírgulas:

    SELECT p1.id, p2.id, v1, v2
    FROM polygons p1
      JOIN polygons p2 ON p1.id != p2.id;
      JOIN LATERAL vertices(p1.poly) v1 ON true ???? 
      JOIN LATERAL vertices(p2.poly) v2 ON (v1 <-> v2) < 10 
    

    O ??? marca a posição em que sua consulta original perdeu uma condição de junção entre v1 e p1 ou p2

    • 1
  2. jjanes
    2021-10-30T08:37:54+08:002021-10-30T08:37:54+08:00

    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.

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve