Estou verificando algumas antigas instruções SQL com o objetivo de documentá-las e provavelmente aprimorá-las.
O DBMS é Oracle
Não entendi uma declaração que tenha a seguinte redação:
select ...
from a,b
where a.id=b.id(+)
Estou confuso sobre o (+)
operador e não consegui encontrá-lo em nenhum fórum ... (procurar + entre aspas também não funcionou).
De qualquer forma, usei o 'Explain Plan' do SQLDeveloper e obtive uma saída dizendo isso HASH JOIN, RIGHT OUTER
, etc.
Haveria alguma diferença se eu remover o (+)
operador no final da consulta? O banco de dados precisa atender a alguma condição (como ter alguns índices etc.) antes de (+)
poder ser usado? Seria muito útil se você pudesse me fornecer uma compreensão simples ou alguns bons links onde eu possa ler sobre isso.
Obrigado!
sql
oracle
join
outer-join
Sekhar
fonte
fonte
Respostas:
Essa é a notação específica do Oracle para uma OUTER JOIN, porque o formato ANSI-89 (usando uma vírgula na cláusula FROM para separar as referências da tabela) não padroniza as junções OUTER.
A consulta seria reescrita na sintaxe ANSI-92 como:
Este link é muito bom para explicar a diferença entre JOINs .
Deve-se notar também que, embora
(+)
funcione, a Oracle recomenda não usá-lo :fonte
O operador (+) indica uma junção externa. Isso significa que o Oracle ainda retornará registros do outro lado da junção, mesmo quando não houver correspondência. Por exemplo, se aeb são emp e departamento e você pode ter funcionários não atribuídos a um departamento, a declaração a seguir retornará detalhes de todos os funcionários, independentemente de terem sido atribuídos ou não a um departamento.
Resumindo, remover o (+) pode fazer uma diferença significativa, mas você pode não perceber por um tempo, dependendo dos seus dados!
fonte
No Oracle, (+) indica a tabela "opcional" em JOIN. Então, na sua consulta,
é uma junção externa esquerda da tabela 'b' para a tabela 'a'. Ele retornará todos os dados da tabela 'a' sem perder seus dados quando o outro lado (tabela opcional 'b') não tiver dados.
A sintaxe padrão moderna para a mesma consulta seria
ou com um atalho para
a.id=b.id
(não suportado por todos os bancos de dados):Se você remover (+), será uma consulta de junção interna normal
Sintaxe mais antiga, no Oracle e em outros bancos de dados:
Sintaxe mais moderna:
Ou simplesmente:
Ele retornará apenas todos os dados onde o valor 'id' da tabela 'a' e 'b' for igual, significa parte comum.
Se você deseja fazer da sua consulta uma Junta Direita
É exatamente o mesmo que LEFT JOIN, mas alterna qual tabela é opcional.
Sintaxe antiga do Oracle:
Sintaxe padrão moderna:
Referência e ajuda:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
Junção externa esquerda usando o sinal + no Oracle 11g
https://www.w3schools.com/sql/sql_join_left.asp
fonte
Na prática, o símbolo + é colocado diretamente na instrução condicional e ao lado da tabela opcional (aquela que pode conter valores vazios ou nulos dentro da condicional).
fonte