Eu estou interessado em aprender algumas maneiras (idealmente) de banco de dados agnóstica de selecionar o n º linha de uma tabela de banco de dados. Também seria interessante ver como isso pode ser alcançado usando a funcionalidade nativa dos seguintes bancos de dados:
- servidor SQL
- MySQL
- PostgreSQL
- SQLite
- Oráculo
Atualmente, estou fazendo algo como o seguinte no SQL Server 2005, mas estaria interessado em ver as abordagens mais agnósticas de outras pessoas:
WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000
Crédito para o SQL acima: Firoz Ansari's Weblog
Atualização: Veja a resposta de Troels Arvin sobre o padrão SQL. Troels, você tem algum link que possamos citar?
OrderNo N
, introduza uma coluna OrderSequenceNo na tabela e gere-a a partir de um gerador de sequência independente ao criar um novo pedido.offset x fetch first y rows only
. Atualmente suportado por (pelo menos) Postgres, Oracle12, DB2.Respostas:
Existem maneiras de fazer isso em partes opcionais do padrão, mas muitos bancos de dados suportam sua própria maneira de fazê-lo.
Um site realmente bom que fala sobre isso e outras coisas é http://troels.arvin.dk/db/rdbms/#select-limit .
Basicamente, o PostgreSQL e o MySQL suportam o não padrão:
Oracle, DB2 e MSSQL suportam as funções de janela padrão:
(que acabei de copiar do site vinculado acima, pois nunca uso esses bancos de dados)
Atualização: A partir do PostgreSQL 8.4, as funções de janelas padrão são suportadas; portanto, espere que o segundo exemplo funcione também para o PostgreSQL.
Atualização: o SQLite adicionou suporte às funções da janela na versão 3.25.0 em 15/09/2018, para que ambos os formulários também funcionem no SQLite.
fonte
WHERE rownumber = n
apenas a enésima linha?O PostgreSQL suporta funções de janelas, conforme definidas pelo padrão SQL, mas são estranhas; portanto, a maioria das pessoas usa (o não padrão)
LIMIT
/OFFSET
:Este exemplo seleciona a 21a linha.
OFFSET 20
está dizendo ao Postgres para pular os 20 primeiros registros. Se você não especificar umaORDER BY
cláusula, não há garantia de qual registro você receberá, o que raramente é útil.fonte
Não tenho certeza de nada, mas sei que o SQLite e o MySQL não têm nenhuma ordem de linha "padrão". Nesses dois dialetos, pelo menos, o seguinte fragmento pega a 15ª entrada da tabela, classificando pela data / hora em que foi adicionado:
(é claro, você precisará adicionar um campo DATETIME e defini-lo como a data / hora em que a entrada foi adicionada ...)
fonte
O SQL 2005 e superior possuem esse recurso interno. Use a função ROW_NUMBER (). É excelente para páginas da web com navegação no estilo << Anterior e Próximo >>:
Sintaxe:
fonte
Eu suspeito que isso seja extremamente ineficiente, mas é uma abordagem bastante simples, que funcionou em um pequeno conjunto de dados em que eu tentei.
Isso obteria o quinto item, altere o segundo número superior para obter um enésimo item diferente
Apenas servidor SQL (acho), mas deve funcionar em versões mais antigas que não suportam ROW_NUMBER ().
fonte
1 pequena alteração: n-1 em vez de n.
fonte
Verifique no SQL Server:
Isso lhe dará a 10ª fila de emp emp!
fonte
Ao contrário do que algumas das respostas afirmam, o padrão SQL não é silencioso em relação a esse assunto.
Desde o SQL: 2003, você pode usar "funções da janela" para ignorar linhas e limitar conjuntos de resultados.
E no SQL: 2008, uma abordagem um pouco mais simples foi adicionada, usando
OFFSET skip ROWS FETCH FIRST n ROWS ONLY
Pessoalmente, não acho que a adição do SQL: 2008 fosse realmente necessária; portanto, se eu fosse ISO, o manteria fora de um padrão já bastante amplo.
fonte
Quando costumávamos trabalhar no MSSQL 2000, fizemos o que chamamos de "triple-flip":
EDITADO
Não era elegante, nem rápido, mas funcionou.
fonte
IF / ELSE IF
blocos abaixo doOuterPageSize
cálculo - nas páginas 1 e 2, elesOuterPageSize
retornarão o valor para 10. Na página 3 (linhas 21 a 25), o cálculo retornará corretamente 5 e, em todas as páginas 4 e superiores, o resultado negativo do cálculo será substituído por 0 (embora provavelmente seja mais rápido retornar uma linha de dados vazia imediatamente nesse ponto).Selecione o nono registro da parte superior
selecione o nono registro da parte inferior
fonte
Oráculo:
fonte
where ROWNUM = x
funcionará apenas para x = 1 no Oracle DB. ou sejawhere ROWNUM = 2
, não retornará nenhuma linha.No Oracle 12c, você pode usar a
OFFSET..FETCH..ROWS
opção comORDER BY
Por exemplo, para obter o terceiro registro de cima:
fonte
Aqui está uma solução rápida para sua confusão.
Aqui você pode obter a última linha preenchendo N = 0, a segunda última preenchendo N = 1, a quarta última preenchendo N = 3 e assim por diante.
Essa é uma pergunta muito comum durante a entrevista e é muito simples.
Além disso, se você quiser Quantidade, ID ou alguma ordem de classificação numérica que você possa ir para a função CAST no MySQL.
Aqui Ao preencher N = 4, você poderá obter o Quinto Último Registro de Maior Valor da tabela CART. Você pode ajustar o nome do seu campo e tabela e encontrar a solução.
fonte
ADICIONAR:
Isso limitará os resultados a um resultado começando no resultado n.
fonte
Por exemplo, se você quiser selecionar a cada 10 linhas no MSSQL, poderá usar;
Basta pegar o MOD e alterar o número 10 aqui, qualquer número que você quiser.
fonte
Para o SQL Server, uma maneira genérica de usar o número da linha é:
Por exemplo:
Isso retornará as informações da 20ª linha. Certifique-se de inserir o número de linhas 0 depois.
fonte
LIMITE n, 1 não funciona no MS SQL Server. Eu acho que é apenas o único banco de dados importante que não suporta essa sintaxe. Para ser justo, não faz parte do padrão SQL, embora seja tão amplamente suportado que deveria. Em tudo, exceto no SQL Server, o LIMIT funciona muito bem. Para o SQL server, não consegui encontrar uma solução elegante.
fonte
Aqui está uma versão genérica de um sproc que escrevi recentemente para o Oracle que permite paginação / classificação dinâmica - HTH
fonte
Mas, sério, não é tudo isso apenas truques de salão para um bom design de banco de dados? Nas poucas vezes em que precisei de funcionalidades como essa, foi para uma consulta simples e simples para fazer um relatório rápido. Para qualquer trabalho real, usar truques como esses é um problema. Se a seleção de uma linha específica for necessária, basta ter uma coluna com um valor seqüencial e concluir com ela.
fonte
Para o SQL server, o seguinte retornará a primeira linha da tabela de fornecimento.
Você pode percorrer os valores com algo assim:
fonte
No Sybase SQL Anywhere:
Não se esqueça da ordem ou não faz sentido.
fonte
T-SQL - Selecionando o nono número de registro de uma tabela
Por exemplo, para selecionar o 5º registro de uma tabela Employee, sua consulta deve ser
fonte
fonte
Escrevi esta consulta para encontrar a enésima linha. Exemplo com esta consulta seria
fonte
inacreditável que você possa encontrar um mecanismo SQL executando este ...
fonte
Nada extravagante, sem funções especiais, caso você use Caché como eu ...
Dado que você tem uma coluna de ID ou uma coluna de carimbo de data e hora em que pode confiar.
fonte
É assim que eu faria no DB2 SQL, acredito que o RRN (número de registro relativo) é armazenado na tabela pelo O / S;
fonte
Primeiro, selecione as 100 principais linhas ordenando em ordem crescente e, em seguida, selecione a última linha ordenando em ordem decrescente e limite a 1. No entanto, essa é uma declaração muito cara, pois acessa os dados duas vezes.
fonte
Parece-me que, para ser eficiente, é necessário 1) gerar um número aleatório entre 0 e um a menos que o número de registros do banco de dados e 2) poder selecionar a linha nessa posição. Infelizmente, bancos de dados diferentes têm geradores de números aleatórios diferentes e maneiras diferentes de selecionar uma linha em uma posição em um conjunto de resultados - geralmente você especifica quantas linhas ignorar e quantas linhas deseja, mas isso é feito de maneira diferente para bancos de dados diferentes. Aqui está algo que funciona para mim no SQLite:
Depende da capacidade de usar uma subconsulta na cláusula limit (que no SQLite é LIMIT <recs para pular>, <recs para pular>) A seleção do número de registros em uma tabela deve ser particularmente eficiente, sendo parte do banco de dados. metadados, mas isso depende da implementação do banco de dados. Além disso, não sei se a consulta realmente criará o conjunto de resultados antes de recuperar o Nésimo registro, mas espero que não seja necessário. Observe que não estou especificando uma cláusula "order by". Talvez seja melhor "ordenar por" algo como a chave primária, que terá um índice - obter o N-ésimo registro de um índice pode ser mais rápido se o banco de dados não puder obter o N-ésimo registro do próprio banco de dados sem criar o conjunto de resultados .
fonte
Resposta mais adequada que eu vi neste artigo para sql server
fonte