Alguem sabe qual o comando, no Oracle, correspondente ao TOP do SQL server? Ou então, que funcione como o LIMIT do MySQL. A consulta que estou querendo fazer é para selecionar as dez pessoas melhores colocadas num determinado esquema de pontuação. No SQL Server eu fazia:
SELECT TOP 10 * FROM OBRA ORDER BY PONTUACAO DESC
valeuz…
Oracle: Comando Correspondente ao
6 Respostas
Normalmente usa-se algo tipo rownum < 10 no final do where.
Mas não sei qual o comportamento exato disso. Precisa dar uma testada.
Imagine o seguinte exemplo:
SELECT * FROM TESTE;
A B
---------- ----------
A 1
B 2
C 3
D 4
E 5
F 6
T 7
V 8
R 9
Y 10
W 11
X 12
Tenho 12 registros em minha tabela TESTE, conforme observaram acima.
Agora se eu fizer
SELECT * FROM TESTE WHERE ROWNUM < 10;
A B
---------- ----------
A 1
B 2
C 3
D 4
E 5
F 6
T 7
V 8
R 9
Ele me mostrará apenas as 9 primeiras linhas.
Lembre-se, as pseudo-colunas ROWID e ROWNUM são
identificadores de linha e não serve para o propósito
especificado por você em sua mensagem original.
Vou dar uma olhada nos manuais da Oracle para ver se
encontro algo parecido com o TOP que você citou.
Dê uma olhada no link abaixo…
http://asktom.oracle.com/pls/ask/f?p=4950:8:89838428474196211::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:495221712170,
Acho que isso deve resolver o seu problema
Bom, aproveitando o seu exemplo, acabei fazendo o comando assim:
SELECT * FROM (SELECT * FROM TESTE ORDER BY B DESC) WHERE ROWNUM < 10;
Assim, eu ordeno a tabela antes e depois pego apenas as dez primeiras linhas. Agora, não sei o quanto ordenar a tabela para depois selecionar algumas linhas compromete o desempenho. O que vc acha?
valeuz…
jack_-ganzha
[ Esta mensagem foi editada por: jack-_ganzha em 08-03-2003 19:52 ]
Olha o link que eu te enviei trata bem este assunto sobre desempenho.
Geralmente nós utilizamos sub-consultas nesse tipo de coisa, pois nem sempre iremos querer os resultados que são menores que um dado rowid.
Por exemplo, se desejássemos, obter valores em um intervalo específico, como por exemplo em paginação onde geralmente se busca valores de consulta em intervalos definidos essa seria a melhor opção.
Não sei o tamanho da sua tabela, bem como como está a sua estrutura de índice, mas se a tabela for pequena não creio que você terá problemas não.
Teste a variação desse SQL observando o plano de execução do SQL e veja o que pode ser otimizado.
O exemplo citado pelo jack_-_ganzha, com subquery, é o ideal, pois fica bem rápido e resolve o problema. Mas isso só funciona a partir do oracle 8.1.6. Nas versões anteriores não é permitido usar ORDER BY em subqueries.
Nesse caso há um workaround, que é fazer o select MINUS um select que não retorne nada, já que o MINUS faz a ordenação dos dados.
Exemplo
SELECT * FROM (
SELECT id, usuario FROM tabela
MINUS
SELECT 0, ´´ FROM dual WHERE 1 = 2)
WHERE ROWNUM < 10