SóProvas


ID
1740439
Banca
FCC
Órgão
TRE-AP
Ano
2015
Provas
Disciplina
Banco de Dados
Assuntos

 Considere um banco de dados Oracle 11g aberto e em condições ideais que possui as tabelas e campos presentes na instrução PL/SQL:

SELECT e.sobrenome, e.id_departamento, d.nome_departamento

FROM empregados e, departamentos d

WHERE ...I... ;

Usando join externa, para que a consulta recupere todas as linhas na tabela empregados, mesmo que não haja correspondência na tabela departamentos, a lacuna I deve ser preenchida por 

Alternativas
Comentários
  • A questão quer que todos os empregados sejam listados independentes de estarem ou não associados a um departamento.


    a) e.id_departamento(+) = d.id_departamento (INCORRETA)




    Nesse caso serão listados todos os empregados que tenham departamentos correspondentes na tabela departamento mais os departamentos que não tem correspondência na tabela empregado, ou seja, todos departamentos da tabela departamento aparecerão. A questão quer todos empregados listados mesmo sem correspondência de departamento, nesse caso aqui só os empregados participantes do join aparecerão. Esse é um caso típico de RIGHT OUTER JOIN.



    b) d.id_departamento = e.id_departamento (INCORRETA)



    Somente retornará departamentos e empregados que se correspondem nesse join comum. A questão não quer isso.




    c) d.id_departamento = e.id_departamento RIGHT JOIN ON (INCORRETA)



    Sintaxe incorreta (depois  e depois do RIGHT JOIN ON deveria vir uma tabela).



    d) e.id_departamento = d.id_departamento(+) (CORRETA)



    Agora sim! Aqui se traz todos empregados mesmo que não possuam correspondência com departamento.Mas lembrando, não traz departamento sem empregado!



    e) e.id_departamento = d.id_departamento (INCORRETA)


    Idem da letra b. Join comum.

  • Esse recurso (gambiarra) do Oracle é o mesmo que:


    SELECT e.sobrenome, e.id_departamento, d.nome_departamento

    FROM empregados e

    LEFT JOIN departamentos d ON e.id_departamento = d.id_departamento



  • SQL OUTER JOIN

    Usado nos casos em que pretendemos selecionar elementos numa tabela independentemente de estarem presentes numa segunda tabela.

    A sintaxe para efetuar uma união externa na linguagem SQL depende da base de dados. Por exemplo, em Oracle, iremos colocar o sinal "(+)" na cláusula WHERE no outro lado da tabela para a qual queremos incluir todas as linhas.

    http://www.1keydata.com/pt/sql/sql-outer-join.php

  • sintaxe antiga do Oracle a saber

    OUTER LEFT JOIN (quando eu trago todos os itens da tabela da esquerda e os match da direita) o sinal (+) fica na direita.

    RIGHT JOIN (quando eu trago todos os itens da tabela da direita e os match da esquerda) o sinal de (+) fica na esquerda.

    Isto é, quando vc faz um JOIN onde irá ocorrer NULL? é onde fica o (+)

    Referência: https://www.techonthenet.com/oracle/joins.php

  • WHERE

    A.campo      = B.campo(+)  -- Traz todas as linhas da tabela A (com ou sem referência na tabela B). Mesmo que LEFT JOIN

    A.campo(+) = B.campo       -- Traz todas as linhas da tabela B (com ou sem referência na tabela A). Mesmo que RIGTH JOIN

     

    Resumindo: se vc quer trazer todas as linhas de uma tabela, coloque (+) na outra. O raciocínio é invertido mesmo, e é por isso que as bancas adoram.

     

    Bons estudos!