Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Diferença entre a notação plus (+) do Oracle e a notação ansi JOIN?


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 o FROM cláusula OUTER 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 ao FROM cláusula OUTER JOIN sintaxe:
  • Você não pode especificar o (+) operador em um bloco de consulta que também contém FROM sintaxe de junção de cláusula.
  • O (+) operador pode aparecer apenas no WHERE cláusula ou, no contexto de correlação à esquerda (ao especificar a TABLE cláusula) no FROM 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 o OR operador lógico.
  • Um WHERE condição não pode usar o IN condição de comparação para comparar uma coluna marcada com o (+) operador com uma expressão.

Se o WHERE 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. Consulte SELECT para a sintaxe de uma junção externa.