Maneiras alternativas de fazer coisas "corriqueiras"

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Nos meus estudos de oracle eu acabei me deparando com algumas questões que levantaram algumas dúvidas, como formas "alternativas" de se fazer algo corriqueiro.

Por isso, para fim didático gostaria de saber se os colegas do forum poderiam me ajudar a esclarecer as seguintes dúvidas abaixo:

Exemplo:

1) Como fazer um merge de duas tabelas de modo que traga os registro de ambas sem repetição sem utilizar o UNION ou o UNION ALL;

R.: Neste caso como solução pensei em utilizar o SELF-JOIN;

2) Trazer os registros que existem em uma tabela mas que não existam na outra sem utilizar o NOT IN ou o NOT EXISTS;

R.: Neste exemplo, utilizei o CROSS-JOIN com um DISTINCT;
Em ambos os casos acima, fiquei com dúvida pois as soluções encontradas por mim, não me parecem ser as ideais

Além disso qual a diferença de uma sumarização utilizando a função analítica ROW_NUMBER e o GROUP BY?

Alguém sabe me dizer qual é a praticidade da utilização da função LAG? Ou seja, em quais situações posso utilizá-las?

Qual o efeito do HINT "APPEND" em uma instrução DML de INSERT?

Se alguém puder me ajudar a esclarecer essas dúvidas, ficarei muito agradecido.

Abç.,

Att.,
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Tem um otimo documento sobre funções analíticas:
https://glufke.net/oracle/download/funco ... TICAS.html
Qual a diferença de uma sumarização utilizando a função analítica ROW_NUMBER e o GROUP BY?
Com ROW_NUMBER é possivel numerar as linhas por um grupo, veja: (a ultima coluna SEQ é gerada pelo ROW_NUMBER). Com GROUP BY você consegue fazer somatórios ou médias de um grupo específico. (totalmente outro objetivo)

Selecionar tudo

SELECT ename "Ename", deptno "Deptno", sal "Sal",
  SUM(sal)
    OVER (ORDER BY deptno, ename) "Running Total",
  SUM(SAL)
    OVER (PARTITION BY deptno
          ORDER BY ename) "Dept Total",
  ROW_NUMBER()
    OVER (PARTITION BY deptno
          ORDER BY ENAME) "Seq"
FROM emp
ORDER BY deptno, ename
/

Ename  Deptno    Sal Running Total Dept Total  Seq
------ ------ ------ ------------- ---------- ----
CLARK      10   2450          2450       2450    1
KING            5000          7450       7450    2
MILLER          1300          8750       8750    3

ADAMS      20   1100          9850       1100    1
FORD            3000         12850       4100    2
JONES           2975         15825       7075    3
SCOTT           3000         18825      10075    4
SMITH            800         19625      10875    5

ALLEN      30   1600         21225       1600    1
BLAKE           2850         24075       4450    2
JAMES            950         25025       5400    3
MARTIN          1250         26275       6650    4
TURNER          1500         27775       8150    5
WARD            1250         29025       9400    6
Alguém sabe me dizer qual é a praticidade da utilização da função LAG? Ou seja, em quais situações posso utilizá-las?
LAG é super util. Com ele você consegue pegar informações digamos "da linha anterior".
Veja esse exemplo:

Selecionar tudo

SELECT ename,hiredate,sal,
LAG(sal, 1, 0) 
  OVER (ORDER BY hiredate) AS PrevSal
FROM emp
WHERE job = 'CLERK';
Ename  Hired       SAL PREVSAL
------ --------- ----- -------
SMITH  17-DEC-80   800       0
JAMES  03-DEC-81   950     800
MILLER 23-JAN-82  1300     950
ADAMS  12-JAN-83  1100    1300
Qual o efeito do HINT "APPEND" em uma instrução DML de INSERT?
O append faz com que as novas linhas do INSERT sejam incluídas em novos blocos, ou seja, ele não re-utiliza os espaços em branco de algum possivel bloco solto. Por isso que é mais rápido, pois ele utiliza blocos sequencias e novos. A desvantagem é que a tabela vai CRESCER. Então, tem casos que isso não é problema, pois no fim das contas, a informação será TRUNCADA... Mas pra outros casos, tem que se avaliar bem a sua utilização.

Sobre suas duvidas nas questões de JOIN, MERGE, etc acho que a melhor forma é você nos enviar um exemplo de tabela com o que você espera conseguir. OU até mesmo os inserts pra gente poder simular aqui e testar os exemplos!

:-o
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Ressuscitando este tópico!

dr_gori. Gostaria de agradecer as informações. Foram de grande ajuda e até já cabei utilizando as funções LAG e ROW_NUMBER. Obrigado.

Agora quanto as outras questões:

1) Como fazer um merge de duas tabelas de modo que traga os registro de ambas sem repetição sem utilizar o UNION ou o UNION ALL;

R.: Neste caso como solução pensei em utilizar o SELF-JOIN;

2) Trazer os registros que existem em uma tabela mas que não existam na outra sem utilizar o NOT IN ou o NOT EXISTS;

R.: Neste exemplo, utilizei o CROSS-JOIN com um DISTINCT;
Na questão 1 utilizamos o UNION ou UNION ALL para fazer a junção de duas querys de estruturas e datatypes iguais, dependendo do que precisamos. Não conheço outra forma de fazer isso. Por isso cogitei a hipotese de utilizar o SELF JOIN.

Quanto a questão 2, creio que a sugestão anterior não se aplique. Por isso, havia pensado em utilizar um JOIN com operador "<>", mas não sei se funcionaria.

Por isso, gostaria de recorrer a vocês novamente afim de sanar essas dúvidas.

Grato.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 18 visitantes