Desconsiderando o desempenho, obterá o mesmo resultado da consulta A e B abaixo? E quanto a C e D?
-- A
select *
from a left join b
on <blahblah>
left join c
on <blahblan>
-- B
select *
from a left join c
on <blahblah>
left join b
on <blahblan>
-- C
select *
from a join b
on <blahblah>
join c
on <blahblan>
-- D
select *
from a join c
on <blahblah>
join b
on <blahblan>
sql
join
relational-database
Apenas um aprendiz
fonte
fonte
<blahblah>
? você está juntando A a B e A a C, ou você está juntando A a B e B a C?Respostas:
Para
INNER
junções, não, o pedido não importa. As consultas retornarão os mesmos resultados, desde que você altere suas seleções deSELECT *
paraSELECT a.*, b.*, c.*
.Para (
LEFT
,RIGHT
ouFULL
)OUTER
junções, sim, a ordem é importante - e ( atualizadas ) as coisas são muito mais complicadas.Primeiro, as junções externas não são comutativas; portanto,
a LEFT JOIN b
não é o mesmo queb LEFT JOIN a
Junções externas também não são associativas, portanto, em seus exemplos que envolvem as propriedades (comutatividade e associatividade):
é equivalente a :
mas:
não é equivalente a :
Outro exemplo (talvez mais simples) de associatividade. Pense nisso como
(a LEFT JOIN b) LEFT JOIN c
:Isso é equivalente a
a LEFT JOIN (b LEFT JOIN c)
:somente porque temos
ON
condições "agradáveis" . AmbosON b.ab_id = a.ab_id
ec.bc_id = b.bc_id
são verificações de igualdade e não envolvemNULL
comparações.Você pode até ter condições com outros operadores ou outros mais complexos, como:
ON a.x <= b.x
ouON a.x = 7
ouON a.x LIKE b.x
ouON (a.x, a.y) = (b.x, b.y)
e as duas consultas ainda seriam equivalentes.Se, no entanto, qualquer um desses envolvidos
IS NULL
ou uma função relacionada a nulosCOALESCE()
, como , por exemplo, se a condição fosseb.ab_id IS NULL
, as duas consultas não seriam equivalentes.fonte
a.somecol > 0 OR b.someothercol > 0
; a associatividade pode falhar para essa condição.INNER JOIN
e um seguinteLEFT JOIN
. Funciona assim primeiro, a consulta seráFilter
baseada nos registrosINNER JOIN
e depois será aplicadaLEFT JOIN
aosFiltered
registros?ON
cláusula (ou seja, a "especificação de junção") para um novo local . Isso é apenas sintaxe, no entanto. Se você usar a notação de álgebra relacional (onde a especificação de junção é colocada abaixo do operador de junção), a associatividade se tornará mais evidente. Seu argumento é exibida apenas que as junções externas não são comutativa , que está corretopara junções regulares, isso não acontece.
TableA join TableB
produzirá o mesmo plano de execução queTableB join TableA
(para que seus exemplos de C e D sejam os mesmos)para junções esquerda e direita, ele faz.
TableA left Join TableB
é diferente deTableB left Join TableA
, mas é o mesmo queTableB right Join TableA
fonte
Se você tentar unir C em um campo de B antes de ingressar em B, ou seja:
sua consulta falhará, portanto, nesse caso, o pedido é importante.
fonte
O otimizador Oracle escolhe a ordem de junção das tabelas para junção interna. O Optimizer escolhe a ordem de junção das tabelas apenas em cláusulas FROM simples. Você pode verificar a documentação do oracle em seu site. E para a esquerda, a junção externa direita, a resposta mais votada é a correta. O otimizador escolhe a ordem de junção ideal e o índice ideal para cada tabela. A ordem de junção pode afetar qual índice é a melhor escolha. O otimizador pode escolher um índice como o caminho de acesso para uma tabela se for a tabela interna, mas não se for a tabela externa (e não houver mais qualificações).
O otimizador escolhe a ordem de junção das tabelas apenas em cláusulas FROM simples. A maioria das junções que usam a palavra-chave JOIN é achatada em junções simples; portanto, o otimizador escolhe sua ordem de junção.
O otimizador não escolhe a ordem de junção para junções externas; ele usa a ordem especificada na instrução
Ao selecionar uma ordem de junção, o otimizador leva em consideração: O tamanho de cada tabela Os índices disponíveis em cada tabela Se um índice em uma tabela é útil em uma ordem de junção específica O número de linhas e páginas a serem verificadas para cada tabela em cada ordem de junção
fonte