Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cristiano_ferreira

Update com dados de outra tabela

Recommended Posts

Pessoal,

 

Preciso fazer um update em uma tabela (tb_numeros) com dados de outra tabela (tb_num) onde cada registro da tabela tb_numeros ira receber um registro diferente e aleatorio da tabela tb_num. Então que para cada seleção realizada na tb_num irei ter que fazer um update na seleção para marcar como já usado. Na logica seria assim:

 

WHILE tb_numeros

 

DECLARE @numero INT;

SET @numero = SELECT TOP 1 tb_num.numero FROM tb_num WHERE tb_num.status = 0 ORDER BY NEWID();

 

UPDATE tb_numero SET tb_numero.numero = @numero

 

UPDATE tb_num SET tb_num.st = 1 WHERE tb_num.numero = @numero

 

FIM do WHILE

 

Algo assim... más tem que ser um registro da tb_num gravado em um registro da tb_numeros diferente do outro...

 

Não sei se consegui explicar... más é mais ou menos isto.

 

Agradeço desde já pessoal

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

tb_numero tem chave ?

 

tb_numero e tb_num tem a mesma quantidade de registros ?

 

Uma solução

 

Crie um array com (tb_num.numero, valor aleatorio)

 

Ordene este array pelo valor aleatorio.

 

Leia tb_numero

Para cada registro lido

Selecionar primeira posição do array

UPDATE tb_numero SET tb_numero.numero = array.numero(1) where tb_numero.chave =(chave lida)

UPDATE tb_num SET tb_num.st = 1 WHERE tb_num.numero = array.numero(1)

Deletar a primeira posição do array

fim

 

Grosso modo , mas é preciso uma "chave" de tb_numero

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentando explicar melhor:

 

 

 

Tenho uma tabela de funcionários chamada tb_funcionarios. Para cada funcionário que atende a alguns quesitos ele ganha 1 numero da sorte ou 3 numeros da sorte. Ex.: Se ele não tem nenhuma falta ele ganha 3 numeros da sorte e se ele tem faltas justificadas e abonadas ele ganha somente 1. Caso ele tenha faltas injustificadas, suspenções e advertências ele não ganha nada.

 

tb_funcionarios

id_funcionario, INT iDENTITY (1,1) NOT NULL -> PK

nome_func NVARCHAR (255) NULL

nivel_penalidade INT NULL -> Aqui vai conter a penalidade do funcionário que pode ser 0 para nenhuma, 1 para falta abonada, 2 para falta justificada, 3 para falta injustificada, 4 para advertência e 5 para suspenção.

 

Até aí está OK. Já estou gerando na tabela tb_numeros a quantidade de registros com o id_funcinario para cada um que recebeu o número. Ou seja, se tenha 10 funcionários, 3 sem nenhuma penalidade, 4 com penalidades mínima (faltas abonadas e justificadas) e 3 com penalidades restritivas (suspenções, faltas injustificadas e advertências), terei na tb_numeros 9 registros dos funcionarios sem penalidades (cada 1 terá que receber 3 números) e 4 com penalidades mínimas (apenas 1 numero neste caso). Então terei 13 registros na minha base tb_numeros.

 

tb_numeros

id_numero INT IDENTITY (1,1) NOT NULL -> PK

id_funcionario INT NULL -> Aqui entra o ID do funcionário da tabela tb_funcionarios

numero INT NULL -> Aqui deve entrar os numeros da tabela tb_num

status INT NULL -> Aqui imaginei que para cada registro que houvesse recebido um número eu colocaria 1

 

Daí preciso que cada um destes registros receba 1 numero diferente e único (não pode haver registros repetidos).

 

Pensei da seguinte forma: Monto uma tabela chamada tb_num que conterá os 9999 numeros que posso sortear de maneira randômica, ou seja, um para cada registro que existir em minha tb_numeros, sem precisar gerar um número aleatôrio randômico. Outro deltalhe que cada número tem que ter 4 digitos e deve ser inteiro ou seja, tem que ser 0001 e não 1.

 

tb_num

id_num INT IDENTITY (1,1) NOT NULL -> PK

num INT NULL -> Número de 0000 a 9999

status INT -> Recebe um 1 quando o número do registro for gravado em tb_numeros. Forma de identificar se o número já foi usado ou não.

Não sei se consegui explicar bem pessoal, más é mais ou menos isso... Eu tenho muito pouco conhecimento em SQL e fazer isto via ASP não dá certo pois são muitos registros a serem gerados e muitas validações a serem feitas. Acaba dando timeout, mesmo controlando o Buffer e o Timeout. Assim o que me resta é gerar os registros via ASP e montar a colocação dos números nos registros de numeros via SQL (talvez procedure). No total são 5501 funcinários que dá 2007 com 3 numeros e 1870 com apenas 1 numero.

 

Desde já agradeço muito pela força pessoal.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Conheco poucoa sintaxe de sql server mas faria uma stored procedure, mesmo que para executar uma vez

 

Um select conta quantos registros de números serao criados

 

Um for ou while cria a sequncia

 

Um cursor faz um select dos funcionarios e numeros a que tem direito ordernado aleatoriamente

 

Enquanto nao fim do cursor faca

Update na tabela de numeros com a matricula do funcionario na posicao lida do cursor(contador)

Fim enquanto

 

Meu algoritmo é meio bagunçado no método mas creio que resolva.

 

Estou editando num tablet que limita algumas coisas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu estou vendo de um celular e no meio de uma reuniao, mas acho que entendi o que tu precisa.

vc tem a tabela funcionario e a tabela com os numeros gerados de forma randomica jah ok?

pq nao gera uma terceira tabela referenciando o id_func com o id_num, da tabela de numeros???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estão... tenho a tabela funcionários (tb_funcionarios) e tabela com os números (tb_num) e tenho também a tabela que vai receber o id_funcionarios (tb_funcionario) e o numero (tb_num) que é a (tb_numeros). O que não estou conseguindo é fazer o update dos números na tabela junto com o id do funcinarios.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.