Posso fazer SELECT TOP (200) ... mas por que não BOTTOM (200)?
Bem, para não entrar na filosofia, o que quero dizer é: como posso fazer o equivalente a TOP (200), mas ao contrário (a partir de baixo, como você esperaria que BOTTOM fizesse ...)?
SELECT
columns
FROM
(
SELECT TOP 200
columns
FROM
My_Table
ORDER BY
a_column DESC
) SQ
ORDER BY
a_column ASC
Isso é desnecessário. Você pode usar um
ORDER BY
e apenas alterar o tipo paraDESC
para obter o mesmo efeito.fonte
Desculpe, mas acho que não vejo nenhuma resposta correta em minha opinião.
A
TOP
função x mostra os registros em ordem indefinida. Dessa definição segue que umaBOTTOM
função não pode ser definida.Independente de qualquer índice ou ordem de classificação. Quando você faz um,
ORDER BY y DESC
obtém primeiro as linhas com o valor y mais alto. Se for um ID gerado automaticamente, deve mostrar os últimos registros adicionados à tabela, conforme sugerido nas demais respostas. Contudo:TOP
funçãoA resposta correta deve ser que não há, e não pode haver, um equivalente
TOP
para obter as linhas de baixo.fonte
Logicamente,
Por exemplo, selecione 1000 inferiores do funcionário:
Em T-SQL,
fonte
Parece que qualquer uma das respostas que implementam uma cláusula ORDER BY na solução está perdendo o ponto ou não entende o que TOP retorna para você.
TOP retorna um conjunto de resultados de consulta não ordenado que limita o conjunto de registros aos primeiros N registros retornados. (Da perspectiva do Oracle, é semelhante a adicionar um where ROWNUM <(N + 1).
Qualquer solução que usa um pedido, pode retornar linhas que também são retornadas pela cláusula TOP (desde que esse conjunto de dados foi desordenado em primeiro lugar), dependendo de quais critérios foram usados na ordem por
A utilidade do TOP é que uma vez que o conjunto de dados atinge um certo tamanho N, ele para de buscar linhas. Você pode ter uma ideia da aparência dos dados sem precisar buscá-los todos.
Para implementar o BOTTOM com precisão, seria necessário buscar todo o conjunto de dados não ordenado e, em seguida, restringir o conjunto de dados aos N registros finais. Isso não será particularmente eficaz se você estiver lidando com mesas enormes. Nem vai necessariamente dar o que você pensa que está pedindo. O final do conjunto de dados pode não ser necessariamente "as últimas linhas inseridas" (e provavelmente não será para a maioria dos aplicativos DML intensivos).
Da mesma forma, as soluções que implementam um ORDER BY são, infelizmente, potencialmente desastrosas ao lidar com grandes conjuntos de dados. Se eu tenho, digamos, 10 bilhões de registros e quero os últimos 10, é uma grande tolice solicitar 10 bilhões de registros e selecionar os últimos 10.
O problema aqui é que BOTTOM não tem o significado que pensamos ao compará-lo com TOP.
Quando os registros são inseridos, excluídos, inseridos, excluídos repetidamente, algumas lacunas aparecerão no armazenamento e, posteriormente, as linhas serão encaixadas, se possível. Mas o que vemos frequentemente, quando selecionamos TOP, parece ser dados classificados, porque podem ter sido inseridos no início da existência da tabela. Se a tabela não apresentar muitas exclusões, pode aparecer ordenada. (por exemplo, as datas de criação podem ser tão antigas quanto a própria criação da tabela). Mas a realidade é que, se esta for uma tabela com muitas exclusões, as linhas TOP N podem não se parecer com nada.
Então - o ponto principal aqui (trocadilho intencional) é que alguém que está pedindo os registros BOTTOM N não sabe realmente o que está pedindo. Ou, pelo menos, o que eles estão pedindo e o que BOTTOM realmente significa não são a mesma coisa.
Portanto - a solução pode atender à necessidade real de negócios do solicitante ... mas não atende aos critérios para ser o BOTTOM.
fonte
insert
declaração para colocar linhas em uma grande tabela não indexada. (Estou preenchendo a tabela antes de começar a indexá-la.) Perdi minha sessão de cliente devido a uma reinicialização ou algo assim, e agora quero ver se minhas linhas recém-adicionadas estão lá. Se a linha 'inferior' da tabela for uma das minhas mais recentes, sei que a operação foi concluída. Se a linha 'inferior' for outra coisa, bem, não há garantias e eu tenho que verificar toda a tabela para ter certeza ... mas provavelmente eu poderia economizar algum tempo verificando rapidamente a 'parte inferior' assim como você pode topo'.A resposta atualmente aceita por "Justin Ethier" não é uma resposta correta como apontado por "Protetor um".
Até onde posso ver, até o momento, nenhuma outra resposta ou comentário fornece o equivalente a BOTTOM (x) que o autor da pergunta fez.
Primeiro, vamos considerar um cenário em que essa funcionalidade seja necessária:
Isso retorna uma tabela de uma coluna e cinco registros:
Como você pode ver: não temos uma coluna de ID; não podemos ordenar pela coluna retornada; e não podemos selecionar os dois últimos registros usando o SQL padrão como podemos fazer para os dois primeiros registros.
Aqui está minha tentativa de fornecer uma solução:
E aqui está uma solução mais completa:
Não estou de forma alguma afirmando que esta é uma boa idéia para usar em todas as circunstâncias, mas fornece os resultados desejados.
fonte
Tudo que você precisa fazer é reverter seu
ORDER BY
. Adicione ou removaDESC
-o.fonte
O problema de ordenar de outra forma é que muitas vezes não faz bom uso dos índices. Também não é muito extensível se você precisar selecionar um número de linhas que não estão no início ou no final. Uma forma alternativa é a seguinte.
fonte
A resposta "Tom H" acima está correta e funciona para mim ao obter as 5 linhas inferiores.
Obrigado.
fonte
tente isso.
fonte
Eu encontrei uma solução para isso que não exige que você saiba o número de linhas retornadas.
Por exemplo, se você deseja obter todos os locais registrados em uma tabela, exceto o mais recente 1 (ou 2, ou 5 ou 34)
fonte
Consultar uma subconsulta simples classificada em ordem decrescente, seguida pela classificação na mesma coluna em ordem crescente, resolve o problema.
fonte
Onde ID é a chave primária da TABELA1.
fonte
Primeiro, crie um índice em uma subconsulta de acordo com a ordem original da tabela usando:
Em seguida, ordene a tabela em ordem decrescente pela
RowIndex
coluna que você criou na consulta principal:E, finalmente, use
TOP
com a quantidade desejada de linhas:fonte