DUVAIDA EM SQL
Olá amigos,
Em uma tabela com os campos [Ô]codigo[Ô] e [Ô]nome[Ô] possuo os seguinte dados
001 - Maria
002 - José
004 - Flávio
006 - Joana
Observem que, seguindo uma ordem faltam os códigos [Ô]003[Ô] e [Ô]005[Ô]. Existe alguma função em SQL que me retorne esses códigos que estão faltando?
obs: Se ler registro por registro procurando o que está faltando eu sei que funciona, mas o que eu preciso é de uma SQL que me retorne apenas os códigos ausentes.
Grato.
Em uma tabela com os campos [Ô]codigo[Ô] e [Ô]nome[Ô] possuo os seguinte dados
001 - Maria
002 - José
004 - Flávio
006 - Joana
Observem que, seguindo uma ordem faltam os códigos [Ô]003[Ô] e [Ô]005[Ô]. Existe alguma função em SQL que me retorne esses códigos que estão faltando?
obs: Se ler registro por registro procurando o que está faltando eu sei que funciona, mas o que eu preciso é de uma SQL que me retorne apenas os códigos ausentes.
Grato.
Acho que não há como fazer isso.
A sql vai retornar os valores de uma tabela e não um valor que não exista nela.
A sql vai retornar os valores de uma tabela e não um valor que não exista nela.
kra que eu saiba não, essa pergunta é maie estranha, teria sentido se você fosse fazer join com outra tabela e ai assim teria como saber os numeros que estam faltando nessa tabela em realação a outra.
ou enatão fazer uma procedure rdando um for de 1 ate o seu maior numero ai voce pega o seu numero retira os zeros iniciais e compara com o i se o numero for igual ao i é porque existe, isso é a sua query que vai trazer os numero de sua tabela tem que estar ordenada ascendentemente.
não sei se ajudei com a ideia.
ou enatão fazer uma procedure rdando um for de 1 ate o seu maior numero ai voce pega o seu numero retira os zeros iniciais e compara com o i se o numero for igual ao i é porque existe, isso é a sua query que vai trazer os numero de sua tabela tem que estar ordenada ascendentemente.
não sei se ajudei com a ideia.
Amigos,
No meu caso se está faltando os códigos 003 e 005 é porque eles foram excluidos. O sitema precisa utilizar uma numeração sequancial então o proximo numero seguindo uma ordem seria 007, como os numeros 003 e 005 foram excluidos ele aproveitaria um desses numeros.
Aguardo ajudas!
No meu caso se está faltando os códigos 003 e 005 é porque eles foram excluidos. O sitema precisa utilizar uma numeração sequancial então o proximo numero seguindo uma ordem seria 007, como os numeros 003 e 005 foram excluidos ele aproveitaria um desses numeros.
Aguardo ajudas!
Eu não aconselho fazer isso, principalmente se sua aplicação é utilizada em ambiente de rede, pois com este princÃcio, você pode atribuir um mesmo código a dois registros distintos e perder o controle.
A melhor coisa a se fazer é usar sempre uma sequência, assim se uma hora sua aplicação estiver com muitos acessos, este irfá sempre pegar o próximo número naturalmente.
Agora vem uma pergunta para você HENRYERE: Este números estão sendo gerados pela sua aplicação ou através de uma sequence (caso de Oracle, Firebird ou Postgree) ou por um campo de auto incremento (caso do MySQL, SQL Server e Access)?
A melhor coisa a se fazer é usar sempre uma sequência, assim se uma hora sua aplicação estiver com muitos acessos, este irfá sempre pegar o próximo número naturalmente.
Agora vem uma pergunta para você HENRYERE: Este números estão sendo gerados pela sua aplicação ou através de uma sequence (caso de Oracle, Firebird ou Postgree) ou por um campo de auto incremento (caso do MySQL, SQL Server e Access)?
Não seria mais fácil criar um campo na sua tabela com o tipo BIT. e se o usuário quiser excluir este registro, VC grava neste registro TRUE.
Assim, VC não perde o histórico deste registro, e para relatórios futuros, VC consegue saber que tais registros foram excluÃdos, e até saber QUEM foi que excluiu.
E SE, o cara que excluiu [Ô]acidentalmente[Ô] quiser RECUPERAR este registro, VC simplesmente GRAVA neste registro este campo como FALSE e BLZ.
PS: Todas as suas QUERYS teriam que ter este campo no WHERE e pegar os registros onde este CAMPO esteja = FALSE
Assim, VC não perde o histórico deste registro, e para relatórios futuros, VC consegue saber que tais registros foram excluÃdos, e até saber QUEM foi que excluiu.
E SE, o cara que excluiu [Ô]acidentalmente[Ô] quiser RECUPERAR este registro, VC simplesmente GRAVA neste registro este campo como FALSE e BLZ.
PS: Todas as suas QUERYS teriam que ter este campo no WHERE e pegar os registros onde este CAMPO esteja = FALSE
Cara,
Também concordo que numeros perdidos por Exclusão não devam ser reaproveitados mas, você é que sabe das suas necessidades.
Bem, se o seu SGBD for SQLSerevr, vai aqui uma procedure que irá retornar o primeiro numero livre, seja ele no meio ou o último gravado + 1.
Só tenha cuidado com transações para garantir integridade. Talvez seja melhor fazer esta consulta e a inclusão dentro de uma só transação para garantir essa integridade.
--- Procedure no SQLServer ---
CREATE PROC PrimeiroLivre
AS
DECLARE @Fim AS BIGINT
DECLARE @Resposta AS BIGINT
DECLARE @Contador AS TABLE (Codigo AS BIGINT)
SELECT @Fim = MAX(Codigo) FROM Tabela
SET @Resposta = @Fim + 1
SET @Fim = @Fim - 1
WHILE @Fim > 0
BEGIN
INSERT INTO @Contador (Codigo) SELECT @Fim
SET @Fim = @Fim -1
END
SELECT @Fim = MIN(B.Codigo)
FROM Tabela A
LEFT JOIN @Contador B
ON A.Codigo = B.Codigo
WHERE A.Codigo IS NULL
IF @Fim IS NULL
SELECT @Contador
ELSE
SELECT @Fim
---
Também concordo que numeros perdidos por Exclusão não devam ser reaproveitados mas, você é que sabe das suas necessidades.
Bem, se o seu SGBD for SQLSerevr, vai aqui uma procedure que irá retornar o primeiro numero livre, seja ele no meio ou o último gravado + 1.
Só tenha cuidado com transações para garantir integridade. Talvez seja melhor fazer esta consulta e a inclusão dentro de uma só transação para garantir essa integridade.
--- Procedure no SQLServer ---
CREATE PROC PrimeiroLivre
AS
DECLARE @Fim AS BIGINT
DECLARE @Resposta AS BIGINT
DECLARE @Contador AS TABLE (Codigo AS BIGINT)
SELECT @Fim = MAX(Codigo) FROM Tabela
SET @Resposta = @Fim + 1
SET @Fim = @Fim - 1
WHILE @Fim > 0
BEGIN
INSERT INTO @Contador (Codigo) SELECT @Fim
SET @Fim = @Fim -1
END
SELECT @Fim = MIN(B.Codigo)
FROM Tabela A
LEFT JOIN @Contador B
ON A.Codigo = B.Codigo
WHERE A.Codigo IS NULL
IF @Fim IS NULL
SELECT @Contador
ELSE
SELECT @Fim
---
Os numeros são gerados pela aplicação, e acreditem: no meu caso esse procedimento é necessário... Com a estrutura que montei não existe a possibilidade de se perder e gerar dois numeros iguais, mesmo trabalhando em rede... Estou atento em relação a este problema... O que preciso é simples, saber se é possivel ou não criar esta rotina em SQL.
Ahh... Vou analisar a procedure do amigo RCMRO
Grato.
Ahh... Vou analisar a procedure do amigo RCMRO
Grato.
HENNYERE, boa noite.
Deixa eu colocar um ponto de vista.
Imagina que você tenha uma tabela de cadastro de produtos, por exemplo. Nesta tabela você tem 50.000 registros, sem considerar o que você quer saber. Com a base de dados me rede, tente calcular quanto tempo a consulta vai levar pra selecionar um determinado registro, levando em consideração que nem todas as maquinas da rede são sixcore de 2.4GHz cada núcleo, com 5Gb de memoria....... pode ser um pentium III de 900MHz com 128Mb de memória, mais em fim, imagina o tempo que sua aplicação vai levar para encontrar analisando os registros um a um para comparar qual registro não existe para poder retornar???
Esta questão foi levantada no meu útimo semestre e não conseguimos encontrar um ponto positivo que fosse favorável criar tal rotina SQL para retornar este código.
Bom, é iste meu ponto de vista.
Deixa eu colocar um ponto de vista.
Imagina que você tenha uma tabela de cadastro de produtos, por exemplo. Nesta tabela você tem 50.000 registros, sem considerar o que você quer saber. Com a base de dados me rede, tente calcular quanto tempo a consulta vai levar pra selecionar um determinado registro, levando em consideração que nem todas as maquinas da rede são sixcore de 2.4GHz cada núcleo, com 5Gb de memoria....... pode ser um pentium III de 900MHz com 128Mb de memória, mais em fim, imagina o tempo que sua aplicação vai levar para encontrar analisando os registros um a um para comparar qual registro não existe para poder retornar???
Esta questão foi levantada no meu útimo semestre e não conseguimos encontrar um ponto positivo que fosse favorável criar tal rotina SQL para retornar este código.
Bom, é iste meu ponto de vista.
Amigo HENNYERE, Também não trago solução, trago problemas que podem trazer.
Você cadastra o cidadão ai você exclui ele se não fizer exclusão de todos os dados relacionados a ele.
Quando você for cadastrar e tiver o mesmo código em outras tabelas vira zona.
Você cadastra o cidadão ai você exclui ele se não fizer exclusão de todos os dados relacionados a ele.
Quando você for cadastrar e tiver o mesmo código em outras tabelas vira zona.
Tópico encerrado , respostas não são mais permitidas