UPDATE DO SQL - NÃO FUNCIONOU

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jsnpereira
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 12 Out 2010 7:24 pm
Localização: RS
----------------------------------------------------------
Jeison Pereira

"A Natureza tirou a minha audição, mas trouxe a inteligência e a visão".

Olá, Pessoal!

eu já tentei várias vezes não encontramos para resolver a problemas que estou fazendo no exercício
o exercício diz:
Atualize o salário do empregado com segundo maior salário de cada departamento para
10% a menos do maior salário do departamento

eu tentei programar para consultar da SQL veja ai.

SQL

Selecionar tudo

update emp set sal=  1.10 * (select max(ex.sal)                                       
                                from emp ex, dept dx
                                where ex.dptno = dx.deptno
                                 and ex.sal not in(select max(em.sal)
                                                     from emp em, dept dp
                                                     where em.dptno = dp.deptno
                                                     group by dp.dname)
                                                    group by dx.dname)
            where empno in ( select emx.empno                                                       
                                            from emp emx                                                                                                                                    
                                            where sal in(select max(ex.sal)                                                      
                                                           from emp ex, dept dx
                                                           where ex.dptno = dx.deptno
                                                           and sal not in(select max(em.sal)
                                                                               from emp em, dept dp
                                                                                where em.dptno = dp.deptno
                                                                                            group by dp.dname)
                                                                                            group by dx.dname));
mas o mensagem de erro apareceu "ORA-01427: a subconsulta de uma única linha retorna mais de uma linha"
eu já testei subquery no where funcionaram, mas na coluna sal não funciona para armazenar.

Aguardo ao retorno... obrigado
ishii
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 82
Registrado em: Ter, 28 Dez 2010 7:41 pm
Localização: São Paulo - SP

Olá,

Acho que o group by da multiplicação não é necessário.

Selecionar tudo

update emp set sal=  1.10 * (select max(ex.sal)                                        
                                from emp ex, dept dx 
                                where ex.dptno = dx.deptno 
                                 and ex.sal not in(select max(em.sal) 
                                                     from emp em, dept dp 
                                                     where em.dptno = dp.deptno)) 
            where empno in ( select emx.empno                                                        
                                            from emp emx                                                                                                                                    
                                            where sal in(select max(ex.sal)                                                      
                                                           from emp ex, dept dx 
                                                           where ex.dptno = dx.deptno 
                                                           and sal not in(select max(em.sal) 
                                                                               from emp em,deptdp 
                                                                                where em.dptno = dp.deptno )));
Quando você utiliza a função MAX não há necessidade do Group by a não ser que você queira o MAX separado pelo GROUP BY

[]s Ishii
jsnpereira
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 12 Out 2010 7:24 pm
Localização: RS
----------------------------------------------------------
Jeison Pereira

"A Natureza tirou a minha audição, mas trouxe a inteligência e a visão".

Acho que o group by da multiplicação não é necessário.

Código:

Selecionar tudo

update emp set sal=  1.10 * (select max(ex.sal)                                        
                                from emp ex, dept dx 
                                where ex.dptno = dx.deptno 
                                 and ex.sal not in(select max(em.sal) 
                                                     from emp em, dept dp 
                                                     where em.dptno = dp.deptno)) 
            where empno in ( select emx.empno                                                        
                                            from emp emx                                                                                                                                    
                                            where sal in(select max(ex.sal)                                                      
                                                           from emp ex, dept dx 
                                                           where ex.dptno = dx.deptno 
                                                           and sal not in(select max(em.sal) 
                                                                               from emp em,deptdp 
                                                                                where em.dptno = dp.deptno ))); 

Quando você utiliza a função MAX não há necessidade do Group by a não ser que você queira o MAX separado pelo GROUP BY
ishii,

eu testei e funcionou mas os 3 segundo salario por departamento fora alteram tudo iguais quando foram segunda salario pelo tudo departamento... não tem alterar em cada no segundos salarios por departamento.

por exemplo.

Segundo maior salario por departamento atual
joão - 3500.00 - contabilidade
Pedro - 3700.00 - fiscal
maria - 2800.00 - RH


assim esse código foram alterados tudo igual
joão - 3300.00 - contabilidade
Pedro - 3300.00 - fiscal
maria - 3300.00 - RH

só dando uma opnião como faz esse alterar em cada segundo maior salario por cada departamento.

espero que consegue me ajudar para explicar a resolver essa situação
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Oi jsnpereira,

A lógica da sua primeira consulta está errada, pelas regras que você passou. O Ishii só disse como corrigir o erro que estava dando na sua consulta.

Acredito que a consulta correta seja algo como:

Selecionar tudo

update emp e1 
set e1.sal = 0.9 * (select max(e2.sal) 
                    from emp e1 
                    where e1.dptno = e2.deptno)
where (e1.empno, 2) in (select e3.empno, 
                               row_number() over (partition by e3.deptno 
                                                  order by e3.sal desc)
                        from emp e3);

Abraços,
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:

você pode resolver isso com a instrução CASE. Veja um exemplo no item 5 do artigo http://www.fabioprado.net/2011/05/plsql ... sores.html em meu blog.

[]s
Fábio Prado
www.fabioprado.net
rhicky
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 58
Registrado em: Sex, 20 Jul 2007 9:48 am
Localização: S. J. do Rio Preto/SP
Rhicky

Realmente, creio que um "case" seja a solução para este problema.

Abs,
Responder
  • Informação
  • Quem está online

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