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 oFROM
cláusulaOUTER JOIN
sintaxe 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 aoFROM
cláusulaOUTER JOIN
sintaxe:
- Você não pode especificar o
(+)
operador em um bloco de consulta que também contémFROM
sintaxe de junção de cláusula.- O
(+)
operador pode aparecer apenas noWHERE
cláusula ou, no contexto de correlação à esquerda (ao especificar aTABLE
cláusula) noFROM
clá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
WHERE
condição contendo o(+)
operador não pode ser combinado com outra condição usando oOR
operador lógico.- Um
WHERE
condição não pode usar oIN
condição de comparação para comparar uma coluna marcada com o(+)
operador com uma expressão.
Se oWHERE
clá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. ConsulteSELECT
para a sintaxe de uma junção externa.