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 / 28113
Accepted
孔夫子
孔夫子
Asked: 2012-11-04 02:28:58 +0800 CST2012-11-04 02:28:58 +0800 CST 2012-11-04 02:28:58 +0800 CST

Precedência SQL ANSI JOIN

  • 772

Eu tenho uma consulta que se parece com isso:

    SELECT *
      FROM TBLA A
 LEFT JOIN TBLB B ON A.Col1 = B.Col2
RIGHT JOIN TBLC C ON B.Col3 = C.Col4
      JOIN TBLD D ON C.Col5 = D.Col6

Em que ordem as junções serão resolvidas? Estou mais interessado no SQL Server e vou marcar uma explicação para ele como resposta, mas estou igualmente interessado no padrão ANSI/ISO e como ele funciona nos vários RDBMS.

O motivo dessa pergunta era descobrir por que os resultados diferiam dessa consulta

    SELECT *
      FROM TBLA A
CROSS JOIN TBLC C
 LEFT JOIN TBLB B ON A.Col1 = B.Col2 AND B.Col3 = C.Col4
      JOIN TBLD D ON C.Col5 = D.Col6
sql-server mysql
  • 2 2 respostas
  • 3278 Views

2 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2012-11-04T02:43:35+08:002012-11-04T02:43:35+08:00

    Logicamente , as junções são resolvidas na ordem das ONcláusulas da esquerda para a direita.

    A saída de cada junção é uma tabela virtual que vai para a próxima junção.

    Portanto, para a consulta em sua pergunta, o resultado da tabela virtual de A LJ Bé unido à direita em C. A condição de junção de B.Col3 = C.Col4perderá todas as linhas estendidas nulas preservadas pela junção esquerda original, transformando efetivamente a primeira junção de volta em uma junção interna e a tabela virtual resultante (que preserva todas as linhas de C) é então unida internamente em D.

    Portanto, sua consulta inicial pode ser simplificada como

    SELECT *
    FROM TBLA A
    INNER JOIN TBLB B ON A.Col1 = B.Col2
    RIGHT JOIN TBLC C ON B.Col3 = C.Col4
          JOIN TBLD D ON C.Col5 = D.Col6
    

    O que é efetivamente o mesmo que(A IJ B) ROJ (C IJ D)

    A ordem das ONcláusulas não é necessariamente a mesma ordem em que as tabelas aparecem na consulta. Isso também poderia ser reescrito como(C IJ D) LOJ (A IJ B)

    SELECT *
    FROM   TBLC C
           INNER JOIN TBLD D
             ON C.Col5 = D.Col6
           LEFT JOIN TBLA A
                     INNER JOIN TBLB B
                       ON A.Col1 = B.Col2
             ON B.Col3 = C.Col4 
    

    A posição das cláusulas on significa que a junção externa é realizada entre as duas tabelas virtuais resultantes (C IJ D)e (A IJ B)não apenas em uma única tabela.

    Em sua segunda consulta, conceitualmente, a tabela virtual A x Cé deixada unida em B preservando todo o produto cartesiano, então o resultado disso é unido Dao predicado C.Col5 = D.Col6. Isso elimina todas as linhas do resultado final que não se juntam internamente Ce Dsignifica que é equivalente a

    SELECT *
    FROM   TBLC C
           JOIN TBLD D
             ON C.Col5 = D.Col6
           CROSS JOIN TBLA A
           LEFT JOIN TBLB B
             ON A.Col1 = B.Col2
                AND B.Col3 = C.Col4 
    
    • 8
  2. dezso
    2012-11-04T02:33:53+08:002012-11-04T02:33:53+08:00

    No PostgreSQL:

    Use parênteses se necessário para determinar a ordem de aninhamento. Na ausência de parênteses, JOINs são aninhados da esquerda para a direita. Em qualquer caso, JOIN vincula-se com mais firmeza do que as vírgulas que separam os itens FROM.

    http://www.postgresql.org/docs/9.1/static/sql-select.html#SQL-FROM

    • 3

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve