Select com numero sequencial

Firebird

14/04/2011

Gostaria de que um determidado sql me retornasse a sequencia de numeros ex

Select ***, ID, NOME FROM TABELA

Resultado

1, 0, maria
2, 1, joao
3, 2, bruno
........
Eduardo Richeli

Eduardo Richeli

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

28/04/2011

publique sua instrução SQL
GOSTEI 1

Mais Respostas

Wilson Junior

Wilson Junior

14/04/2011

Crie um Generator para isto.

Espero ter colaborado.
GOSTEI 0
Eduardo Richeli

Eduardo Richeli

14/04/2011

a verdade nao e sequencial ao gravar e sim ao executar um select
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

14/04/2011

Eduardo, no Oracle tem o comando ROWNUM, o firebird acho que não tem.
Você ja pensou em criar um procedure? Talvez não seja a melhor solução, mas no seu caso eu acho que é a única... rs!
Pensa ae!
GOSTEI 0
Wilson Junior

Wilson Junior

14/04/2011

Mas você pode utilizar o GENERATOR no seu SQL, não citei na hora de gravar.

Espero ter colaborado.
GOSTEI 0
Anderson

Anderson

14/04/2011

Faz assim:

select
rdb$get_context('USER_TRANSACTION', 'row#') as NUMERO,
rdb$set_context('USER_TRANSACTION', 'row#',
coalesce(cast(rdb$get_context('USER_TRANSACTION', 'row#') as integer), 0) + 1),
NOME from CIDADE;

Defina no componente de visualização, quais campos devem ficar visíveis. Use o campo NUMERO somente para exibição (não serve para ser utilizado como campo chave).

Abraços,

Anderson:.

GOSTEI 0
Eduardo Richeli

Eduardo Richeli

14/04/2011

quase deu certo, porem ao fazer uma segunda consulta o numero continua incremental em vez de iniciar do 0 novamente, alguma sugestão, obrigado a todos
GOSTEI 0
Junior Miranda

Junior Miranda

14/04/2011

Já pensou em usar uma Stored Procedure?

[]'s
GOSTEI 0
Junior Miranda

Junior Miranda

14/04/2011

Já pensou em usar uma Stored Procedure?

[]'s
GOSTEI 0
Eduardo Richeli

Eduardo Richeli

14/04/2011

Já pensou em usar uma Stored Procedure?

[]'s




fim um sp porem ocasiona o mesmo problema
GOSTEI 0
Eduardo Richeli

Eduardo Richeli

14/04/2011

up...
GOSTEI 0
Wilson Junior

Wilson Junior

14/04/2011

COmo você fez seu SQL? Coloque ele aqui...
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/04/2011

tente algo assim:

select
  (select count(c2.id_cargahoraria)
   from cargahoraria c2
   where coalesce(c2.entrada,'01.01.1900') <= coalesce(c1.entrada,'01.01.1900')) ordem,
  c1.*
from cargahoraria c1
order by c1.entrada

nesse caso eu ordenei por entrada e fiz a comparacao por entrada.



se fosse por nome:

select
  (select count(c2.id_cliente)
   from cliente c2
   where c2.nome <= c1.nome and c2.id_cliente <= c1.id_cliente) ordem,
  c1.*
from cliente c1
order by c1.nome, c1.id_cliente

note que no caso acima usei dois campos para ordenação, pois posso ter clientes homônimos.


para que não haja perda de performance  -  por conta da sub-select  -  é melhor que haja índices criados para os campos usados como referência para a geração do campo virtual ordem.
GOSTEI 0
Eduardo Richeli

Eduardo Richeli

14/04/2011

Emerson


Quase foi la

Ficou da seguinte forma

ORDEM ID NOME
1          2   NOME1
1          3   NOME2
1          7   NOME3
1          8   NOME5
1          9   NOME6
1          10   NOME7

isto e repetiu o campo ordem, tentei de outras maneiras, mas deu no mesmo...
GOSTEI 0
Eduardo Richeli

Eduardo Richeli

14/04/2011

COmo você fez seu SQL? Coloque ele aqui...


select
rdb$get_context('USER_TRANSACTION', 'row#') as NUMERO,
rdb$set_context('USER_TRANSACTION', 'row#',
coalesce(cast(rdb$get_context('USER_TRANSACTION', 'row#') as integer), 0) + 1),
NOME from CIDADE;

GOSTEI 0
Carlo Ferreira

Carlo Ferreira

14/04/2011

Fiz aqui e deu certo:

--SETAR UMA VARIÁVEL DE CONTEXTO COM O VALOR 0

SELECT
RDB$SET_CONTEXT(USER_SESSION, SEQ_TMP, 0)
FROM RDB$DATABASE

--UTILIZAR A VARIÁVEL DE CONTEXTO COMO SEQUENCIAL NA PRIMEIRA COLUNA E INCREMENTAR NA SEGUNDA COLUNA
--TERCEIRA E QUARTA COLUNAS SÃO CAMPOS DA TABELA SELECIONADA

SELECT
CAST(TRUNC(CAST(RDB$GET_CONTEXT(USER_SESSION, SEQ_TMP) AS NUMERIC(15,2))) AS INTEGER) SEQUENCIAL,
RDB$SET_CONTEXT(USER_SESSION, SEQ_TMP, CAST(CAST(RDB$GET_CONTEXT(USER_SESSION, SEQ_TMP) AS NUMERIC(15,2)) + 1 AS VARCHAR(25))) INCREMENTANDO,
CODIGO, CIDADE
FROM CIDADES
ORDER BY CIDADE
GOSTEI 0
Deivison Melo

Deivison Melo

14/04/2011

No firebird vc pode usar os famosos generator´s e também nas versões mais novas (se não me falhe a memório 2.1 ou 2.5) já existe o uso das famosas sequences (objetos muito utilizados no oracle).

Poderíamos usar também:

function GeneratorID (aName: string; Connection: TSQLConnection; Incrementa: Boolean): integer;

function GeneratorID (aName: string; Connection: TSQLConnection;
Incrementa: Boolean): integer;
var
Qry: TSQLQuery;
begin
Qry := TSQLQuery.Create(nil);
try
Qry.SQLConnection := Connection;
if Incrementa then
Qry.SQL.Add(
SELECT GEN_ID(+aName+, 1) FROM RDB$DATABASE)
else
Qry.SQL.Add(
SELECT GEN_ID(+aName+, 0) FROM RDB$DATABASE);
Qry.Open;
Result := Qry.Fields[0].AsInteger;
finally
FreeAndNil(Qry);
end;
end;

Abração e bons códigos!!
GOSTEI 0
Eduardo Richeli

Eduardo Richeli

14/04/2011

bem, a cada select ele teria que vir com o contador 1,2,3....., pelo que eu vi no código, terei que fazer manual!
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/04/2011

tópico antigo....

tente assim:

select
  (select count(c2.cc_idclifor)
   from clifor c2
   where c2.cc_nome < c1.cc_nome and c2.cc_idclifor  c1.cc_idclifor)+1 ordem,
  c1.*
from clifor c1
order by c1.cc_nome, c1.cc_idclifor


note que a condição dentro da sub-select depende diretamente da ordem escolhida na select.

para ter uma ajuda mais personalizada, publique ao menos a estrutura da sua tabela.



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

14/04/2011

select
  (select count(c2.cc_idclifor)
   from clifor c2
   where c2.cc_nome < c1.cc_nome and c2.cc_idclifor < > c1.cc_idclifor)+1 ordem,
  c1.*
from clifor c1
order by c1.cc_nome, c1.cc_idclifor
GOSTEI 0
Antonio Alex

Antonio Alex

14/04/2011

Bom dia!
Sei que este post é antigo, mas hj temos já o ROW_NUMBER()

Maiores informações em: http://msdn.microsoft.com/pt-br/library/ms186734.aspx

Abraço!!
Alex Souza
http://pessoalex.wordpress.com/
GOSTEI 1
Rubes Filho

Rubes Filho

14/04/2011

Se for para gravar, use o próprio recurso do Banco (campo auto incremento):
https://www.devmedia.com.br/trabalhando-com-campos-auto-incremento-identity-no-sql-server/17974


Para numerar na própria consulta, faça assim:

select u.usunome, (ROW_NUMBER() over (ORDER BY u.usunome)) AS 'Seq'
from usuario u

Retorno:

usunome Seq
---------------------------------------- --------------------
ADMINISTRADOR DO SISTEMA APOLO 1
ALAN MARIANO GARCIA 2
ALEXSANDRE 3
ALIANE RODRIGUES MOURA 4
GOSTEI 0
Lucas Senna

Lucas Senna

14/04/2011

vc pode fazer da seguinte forma:
WITH C AS(
SELECT
RDB$SET_CONTEXT('USER_TRANSACTION','SEQ',
CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION','SEQ'),0) AS INTEGER) +1) S,
RDB$GET_CONTEXT('USER_TRANSACTION','SEQ') G
FROM RDB$DATABASE
)

SELECT (SELECT C.G FROM C WHERE C.S >=0) AS SEQUENCIA, A.NOMECLIENTE

FROM CLIENTES A
GOSTEI 0
POSTAR