AFAIK, o
(+) A notação está presente apenas para compatibilidade com versões anteriores porque a Oracle a estreou antes que o padrão ANSI para junções fosse implementado. É específico para Oracle e você deve evitar usá-lo em um novo código quando houver uma versão compatível com os padrões equivalente disponível. Parece que há diferenças entre os dois, e o
(+) A notação possui restrições que a sintaxe de junção ANSI não possui. A própria Oracle recomenda que você não use o (+) notação.Descrição completa aqui no Oracle® Database SQL Language Reference11g Release 1 (11.1):
A Oracle recomenda que você use oFROMcláusulaOUTER JOINsintaxe em vez do operador de junção Oracle. Consultas de junção externa que usam o operador de junção Oracle(+)estão sujeitos às seguintes regras e restrições, que não se aplicam aoFROMcláusulaOUTER JOINsintaxe:
- Você não pode especificar o
(+)operador em um bloco de consulta que também contémFROMsintaxe de junção de cláusula.- O
(+)operador pode aparecer apenas noWHEREcláusula ou, no contexto de correlação à esquerda (ao especificar aTABLEcláusula) noFROMcláusula e pode ser aplicado apenas a uma coluna de uma tabela ou exibição.- Se A e B forem unidos por várias condições de junção, você deverá usar o
(+)operador em todas essas condições. Caso contrário, o Oracle Database retornará apenas as linhas resultantes de uma junção simples, mas sem um aviso ou erro para informar que você não tem os resultados de uma junção externa.- O
(+)O operador não produz uma junção externa se você especificar uma tabela na consulta externa e a outra tabela em uma consulta interna.- Você não pode usar o
(+)operador para unir externamente uma tabela a si mesma, embora as autojunções sejam válidas.
Por exemplo, a seguinte declaração não é válida:
SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;
No entanto, a seguinte autojunção é válida:
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id;
- O
(+)O operador pode ser aplicado apenas a uma coluna, não a uma expressão arbitrária. No entanto, uma expressão arbitrária pode conter uma ou mais colunas marcadas com o(+)operador.- Um
WHEREcondição contendo o(+)operador não pode ser combinado com outra condição usando oORoperador lógico.- Um
WHEREcondição não pode usar oINcondição de comparação para comparar uma coluna marcada com o(+)operador com uma expressão.
Se oWHEREcláusula contém uma condição que compara uma coluna da tabela B com uma constante, então o(+)O operador deve ser aplicado à coluna para que o Oracle retorne as linhas da tabela A para as quais gerou nulos para essa coluna. Caso contrário, o Oracle retornará apenas os resultados de uma junção simples.
Em uma consulta que executa associações externas de mais de dois pares de tabelas, uma única tabela pode ser a tabela gerada por nulo para apenas uma outra tabela. Por esse motivo, você não pode aplicar o(+)operador para colunas de B na condição de junção para A e B e na condição de junção para B e C. ConsulteSELECTpara a sintaxe de uma junção externa.