Select com numero sequencial
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
........
Select ***, ID, NOME FROM TABELA
Resultado
1, 0, maria
2, 1, joao
3, 2, bruno
........
Eduardo Richeli
Curtidas 0
Melhor post
Emerson Nascimento
28/04/2011
publique sua instrução SQL
GOSTEI 1
Mais Respostas
Wilson Junior
14/04/2011
Crie um Generator para isto.
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
Eduardo Richeli
14/04/2011
a verdade nao e sequencial ao gravar e sim ao executar um select
GOSTEI 0
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!
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
14/04/2011
Mas você pode utilizar o GENERATOR no seu SQL, não citei na hora de gravar.
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
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:.
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
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
14/04/2011
Já pensou em usar uma Stored Procedure?
[]'s
[]'s
GOSTEI 0
Junior Miranda
14/04/2011
Já pensou em usar uma Stored Procedure?
[]'s
[]'s
GOSTEI 0
Eduardo Richeli
14/04/2011
Já pensou em usar uma Stored Procedure?
[]'s
[]'s
fim um sp porem ocasiona o mesmo problema
GOSTEI 0
Eduardo Richeli
14/04/2011
up...
GOSTEI 0
Wilson Junior
14/04/2011
COmo você fez seu SQL? Coloque ele aqui...
GOSTEI 0
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.
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
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...
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
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
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
--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
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!!
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
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
14/04/2011
tópico antigo....
tente assim:
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.
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
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
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/
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
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
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
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
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