quinta-feira, 30 de outubro de 2025

ORACLE - TOP(N) é uma sintaxe específica do SQL Server (T-SQL).

 1. A Forma Moderna (Oracle 12c e superior): FETCH

Esta é a maneira mais limpa, moderna e recomendada. É a sintaxe padrão do SQL ANSI para limitar linhas.


Para obter o equivalente exato de SELECT TOP 7 ... do SQL Server, você usaria FETCH FIRST 7 ROWS ONLY.


Exemplo:


SQL


SELECT

    nome_da_coluna,

    outra_coluna

FROM

    sua_tabela

ORDER BY

    coluna_de_ordenacao DESC  -- Importante para o "top" ter sentido

FETCH FIRST 7 ROWS ONLY;

2. A Forma Clássica (Oracle 11g e anteriores): ROWNUM

Antes da versão 12c, a única maneira de limitar linhas era usando a pseudo-coluna ROWNUM. No entanto, ela tem uma particularidade importante.


ROWNUM é atribuído antes da cláusula ORDER BY. Se você quiser as 7 primeiras linhas após a ordenação (que é o que o TOP geralmente faz), você precisa usar uma subconsulta.


Exemplo (a forma correta com ORDER BY):


SQL


SELECT *

FROM (

    SELECT

        nome_da_coluna,

        outra_coluna

    FROM

        sua_tabela

    ORDER BY

        coluna_de_ordenacao DESC

)

WHERE ROWNUM <= 7;

Por que a subconsulta é necessária? Se você fizesse isto (forma incorreta):


SQL


-- !! Cuidado: Isto NÃO é o TOP 7 !!

SELECT

    nome_da_coluna,

    outra_coluna

FROM

    sua_tabela

WHERE

    ROWNUM <= 7

ORDER BY

    coluna_de_ordenacao DESC;

O Oracle pegaria as primeiras 7 linhas que ele encontrar (em ordem aleatória de armazenamento), e depois as ordenaria. Você não obteria o "top 7" real.


Bônus: Equivalente ao TOP 7 WITH TIES

Se você precisar do equivalente ao TOP 7 WITH TIES do SQL Server (que inclui todas as linhas que empatam com a 7ª posição), a sintaxe FETCH do Oracle 12c+ também suporta isso:


SQL


SELECT

    nome_da_coluna,

    outra_coluna

FROM

    sua_tabela

ORDER BY

    coluna_de_ordenacao DESC

FETCH FIRST 7 ROWS WITH TIES;

Resumo:


Se você usa Oracle 12c ou mais recente: Use FETCH FIRST 7 ROWS ONLY.


Se você usa Oracle 11g ou mais antigo: Use a subconsulta com WHERE ROWNUM <= 7.

Nenhum comentário:

Postar um comentário