Problema com SubSelect

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
hypinotic
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sex, 12 Fev 2010 6:02 pm
Localização: Cuiabá-MT

Salve galera, sou novo em oracle, porem acostumado com MySql.

e estou tendo um baita problema para fazer uma consulta com 2 bancos

segue o SQL:


Selecionar tudo

SELECT produto.CODPROD, produto.DESCRPROD, produto.MARCA, vendaFinal.VLRVENDA
FROM TBPROD produto, (SELECT venda.NUTAB, venda.CODPROD, venda.VLRVENDA
                      FROM TBVAL venda 
                      WHERE 1=1 ROWNUM<=1 ORDER BY venda.NUTAB DESC
                     ) vendaFinal
WHERE vendaFinal.CODPROD = produto.CODPROD
AND produto.CODPROD = 1


Bom, ma tabela de VENDA pode possuir varios valores, porem quero pegar apenas o ultimo inserido.

o que acontece neste caso, é que sem o ROWNUM, ele funciona perfeitamente, porem retorna diversos codigos do produto em questão. eu gostaria de retornar apenas 1

quando coloco ROWNUM, ele não me retorna nada.

qual o problema?

Desdejá, agradeço!
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

está faltando um AND.

Selecionar tudo

WHERE 1=1 
AND ROWNUM<=1
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

pra que testar se 1 é igual a 1???
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

WHERE 1=1 geralmente é utilizado por consultas escritas dinamicamente, onde sempre se coloca a cláusula WHERE 1=1 pra depois acrescentar condições AND <condição> AND <condição>.... Só funciona com ANDs...

Isso facilita pois não é necessário testar se a consulta necessita de um WHERE e se não é necessário acrescentar o operador AND antes da próxima condição (como no caso da condição logo após o WHERE).

Outras pessoas acreditam que acrescentando o 1=1 pode melhorar a performance de uma consulta, segue um link exclarecendo um pouco esta questão:
http://asktom.oracle.com/pls/asktom/f?p ... 4913325497

:-o
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Entendo a aplicação em algo assim :

http://glufke.net/oracle/viewtopic.php?t=1539

E já vi isso funcionando para substituir joins , no caso ao invés de fazer o join entre as tabelas se constroi algo assim

Selecionar tudo

AND 1 = (SELECT 1 FROM TABELA WHERE ....)
mas em um caso como o de cima não vejo aplicação.
hypinotic
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sex, 12 Fev 2010 6:02 pm
Localização: Cuiabá-MT

Salve galera,

bom, o WHERE 1=1, como o amigo disse, realmente é para acrescentar condições dinamicamente.

em relação ao meu problema, localizei o erro que era a falta de "AND", porem tive q fazer algumas alterações no SELECT.


Tive que adicionar uma subselect para utilizar o ORDER BY, notei q não da para utilizar ROWNUM e ORDER BY no mesmo select.

não sei se estou certo, mas funcionou.


Obrigado a todos
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

esse problema do rownum com o order by tu resolve com a função ROW_NUMBER.
Responder
  • Informação
  • Quem está online

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