DUVAIDA EM SQL

HENNYERE 14/08/2009 09:43:24
#319848
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.
ROBIU 14/08/2009 09:53:34
#319849
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.
ROGERIOLEAL 14/08/2009 10:14:15
#319853
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.
HENNYERE 14/08/2009 11:57:24
#319868
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!
NETMANIA 14/08/2009 13:32:15
#319876
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)?
LCSD 14/08/2009 13:46:28
#319877
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
RCMRO 14/08/2009 14:37:54
#319880
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
---
HENNYERE 14/08/2009 19:02:23
#319898
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.
DANIKULL 14/08/2009 19:16:44
#319899
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.
JESUEL.OLIVEIRA 14/08/2009 23:04:13
#319913
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.
Tópico encerrado , respostas não são mais permitidas