Como você se sai LIMIT
no DB2 para iSeries?
Tenho uma tabela com mais de 50.000 registros e desejo retornar os registros de 0 a 10.000 e os registros de 10.000 a 20.000.
Eu sei que no SQL você escreve LIMIT 0,10000
no final da consulta de 0 a 10.000 e LIMIT 10000,10000
no final da consulta de 10.000 a 20.000
Então, como isso é feito no DB2? Qual é o código e a sintaxe? (exemplo de consulta completo é apreciado)
db2
limit
ibm-midrange
Elcool
fonte
fonte
Respostas:
Usando
FETCH FIRST [n] ROWS ONLY
:http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm
Para obter intervalos, você teria que usar
ROW_NUMBER()
(desde a v5r4) e usar isso dentro daWHERE
cláusula: (roubado daqui: http://www.justskins.com/forums/db2-select-how-to-123209.html )fonte
ROW_NUMBER
não é uma palavra-chave válida. Mas obrigado pelo link, me deu uma ideia e funciona.Desenvolvido este método:
Você PRECISA de uma tabela que tenha um valor exclusivo que possa ser solicitado.
Se você deseja linhas de 10.000 a 25.000 e sua Tabela tem 40.000 linhas, primeiro você precisa obter o ponto inicial e o total de linhas:
int start = 40000 - 10000;
int total = 25000 - 10000;
Em seguida, passe-os por código para a consulta:
fonte
O suporte para OFFSET e LIMIT foi adicionado recentemente ao DB2 para i 7.1 e 7.2. Você precisa dos seguintes níveis de grupo DB PTF para obter este suporte:
Consulte aqui para obter mais informações: documentação OFFSET e LIMIT , DB2 for i Enhancement Wiki
fonte
Esta é a solução que encontrei:
Inicializando LASTVAL para 0 (ou '' para um campo de texto) e, em seguida, definindo-o como o último valor no conjunto de registros mais recente, isso percorrerá a tabela em blocos de N registros.
fonte
N
é menor do que o número de valores idênticos na coluna (embora isso seja verdadeiro ao usarROW_NUMBER()
também). Os valores iniciais também devem ser escolhidos com cuidado -0
obviamente será problemático se a coluna contiver um valor negativo . Cuidado seria necessário com nulos. Não funcionará se as páginas forem puladas.A solução de @elcool é uma ideia inteligente, mas você precisa saber o número total de linhas (que pode até mudar enquanto você executa a consulta!). Portanto, proponho uma versão modificada, que infelizmente precisa de 3 subconsultas em vez de 2:
onde
{last}
deve ser substituído pelo número da linha do último registro que preciso e{length}
deve ser substituído pelo número de linhas que preciso, calculado comolast row - first row + 1
.Por exemplo, se eu quiser linhas de 10 a 25 (no total 16 linhas),
{last}
serei 25 e{length}
25-10 + 1 = 16.fonte
Você também deve considerar a cláusula OPTIMIZE FOR n ROWS. Mais detalhes sobre tudo isso na documentação do DB2 LUW no tópico Diretrizes para restringir instruções SELECT :
fonte
Tente isto
fonte
Existem 2 soluções para paginar com eficiência em uma tabela do DB2:
1 - a técnica usando a função número_da_linha () e a cláusula OVER que foi apresentada em outro post ("SELECT número_da_linha () OVER (ORDER BY ...)"). Em algumas mesas grandes, percebi às vezes uma degradação do desempenho.
2 - a técnica usando um cursor de rolagem. A implementação depende da linguagem utilizada. Essa técnica parece mais robusta em grandes mesas.
Apresentei as 2 técnicas implementadas em PHP durante um seminário no próximo ano. O slide está disponível neste link: http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf
Desculpe, mas este documento está apenas em francês.
fonte
Existem estas opções disponíveis: -
fonte